Видалити перший рядок файлу


110

Як я можу видалити перший рядок файлу та зберегти зміни?

Я спробував це, але це стирає весь вміст файлу.

$sed 1d file.txt > file.txt

Відповіді:


81

Причина file.txt порожня після цієї команди - це порядок, в якому оболонка робить речі. Перше, що відбувається з цією лінією, - це перенаправлення. Файл "file.txt" відкривається і обрізається до 0 байт. Після цього команда sed запускається, але в точці файл вже порожній.

Є кілька варіантів, більшість з яких стосується запису до тимчасового файлу.

sed '1d' file.txt > tmpfile; mv tmpfile file.txt # POSIX
sed -i '1d' file.txt # GNU sed only, creates a temporary file

perl -ip -e '$_ = undef if $. == 1' file.txt # also creates a temporary file

2
З BSD sedви можете користуватися sed -i .bak '1d' file.txt.

1
чи існує спосіб, який не включає темп-файл? У будь-якому випадку це зробить трюк. Дуже дякую!
kickass13

@ kickass13, можливо, використовуючи текстовий редактор, такий як ed.
Йорданм

6
edКоманда буде: printf "%s\n" 1d w q | ed file.txt(I серце ред)
Glenn Джекман

1
@jonayreyes-exec sed -i '1d' {} \;
jordanm

141

Альтернативним дуже легким варіантом є просто "хвіст" всього, крім першого рядка (це може бути простим способом видалення заголовків файлів загалом):

# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout

Після @Evan Teitelman ви можете:

tail -n +2 file.txt | sponge file.txt

Щоб уникнути тимчасового файлу. Іншим варіантом може бути:

echo "$(tail -n +2 file.txt)" > file.txt

І так далі. Тестування останнього:

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ echo "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$ 

На жаль, ми втратили новий рядок (за коментарем @ 1_CR нижче), спробуйте замість цього:

printf "%s\n\n" "$(tail -n +2 file.txt)" > file.txt

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ printf '%s\n\n' "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5  

[user@work ~]$ 

Повертаючись до sed, спробуйте:

printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt

чи, можливо,

echo -e "$(sed '1d' file.txt)\n" > file.txt

Щоб уникнути побічних ефектів.


Я щойно спробував це в моїй системі Fedora, і вихід вище. Ви праві - дякую, що вказали на це.
AsymLabs

tailТрюк працював на мене (знадобилося менше 3 секунд на файл 130MB). Дякую!
elo80ka

echo "$(tail -n +2 file.txt)" > file.txt- ідеальна відповідь.
Алекс Радж Каліаморті

Дякую! echo "$ (tail -n +2 file.txt)"> file.txt працює для мене так само, як і шарм!
Арсеній

16

Також погляньте на spongeс moreutils. spongeзамочує дані зі стандартного введення, поки кінець запису стандартного вводу не закриється перед записом у файл. Він використовується так:

sed '1d' file.txt | sponge file.txt

14

Ця тема викликає інтерес, тому я перевіряю еталон трьома способами:

  1. sed '1d' d.txt > tmp.txt
  2. tail -n +2 d.txt > tmp.txt
  3. sed -i '1d' d.txt

Зауважте, що цільовим d.txtфайлом є 5,4 ГБ

Отримайте результат:


run 1 : sed '1d' d.txt > r1.txt
14s
run 2 : tail -n +2 d.txt > r2.txt
20s
run 3 : sed -i '1d' d.txt
88s

Висновок: Нижче, здається, найшвидший спосіб:

sed '1d' file.txt > tmpfile; mv tmpfile file.txt


Ваш sed '1d' d.txtметод не включав (чи так здається, читаючи ваші тести) mvкоманду. У моїх тестах на FreeBSD з файлом 20 МБ це sed -iбуло найшвидшим.
Sopalajo de Arrierez

9

exможе використовуватися для справжнього редагування на місці , яке не передбачає тимчасового файлу

ex -c ':1d' -c ':wq' file.txt

2
ex використовує тимчасовий файл. strace -e open ex -c ':1d' -c ':wq' foo. ex обрізає оригінальний файл тимчасовим файлом, де опція -i GNU sed замінює оригінал із тимчасовим файлом. Я не впевнений, як працює сім'я BSD.
llua

@llua, ти маєш рацію. Я також помітив це, але пізніше
iruvar

3

Найкоротший і найпростіший спосіб видалити перший рядок з файлу за допомогою sed:

$ sed -i -n -e '2,$p' file.txt

3

Ви можете використовувати Vim в режимі Ex:

ex -s -c '1d|x' file.txt
  1. 1 знайти перший рядок

  2. d видалити

  3. x зберегти і закрити


0

Ця команда видалить 1 рядок і збереже як "file.txt".

sed '1d' file.txt  > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt

0

Щоб видалити рядок утиліти у файлі

  1. Видалити перший рядок

Файл sed '1d'

  1. Видаліть перший і третій рядки

Файл sed '1d3d'

Видалити шаблону в рядку

1 Видаліть перші два статути в ліні

Файл 's /^..//'

2 Видаліть останні два рядки крекрецину

Файл sed 's / .. £ //'

3 Видаліть порожній рядок

Файл Sed '/ ^ £ / d'


4
Чи британці знову взяли колонії? Востаннє я дивився, £$.
G-Man

£ вказується знак долера ..
Vivek parikh


-2

файл кішки01 | sed -e '1,3d'

// показати вміст у file01, але видалити перший та третій рядок


2
команда sed, яку ви дасте, видалить рядки 1, 2 і 3.
icarus

1
Це видаляє більше, ніж просять, і не "стримує зміни"
Jeff Schaller
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.