Відповіді:
Причина 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
ed
.
ed
Команда буде: printf "%s\n" 1d w q | ed file.txt
(I серце ред)
-exec sed -i '1d' {} \;
Альтернативним дуже легким варіантом є просто "хвіст" всього, крім першого рядка (це може бути простим способом видалення заголовків файлів загалом):
# -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
Щоб уникнути побічних ефектів.
tail
Трюк працював на мене (знадобилося менше 3 секунд на файл 130MB). Дякую!
echo "$(tail -n +2 file.txt)" > file.txt
- ідеальна відповідь.
Також погляньте на sponge
с
moreutils
. sponge
замочує дані зі стандартного введення, поки кінець запису стандартного вводу не закриється перед записом у файл. Він використовується так:
sed '1d' file.txt | sponge file.txt
Ця тема викликає інтерес, тому я перевіряю еталон трьома способами:
sed '1d' d.txt > tmp.txt
tail -n +2 d.txt > tmp.txt
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
було найшвидшим.
ex
може використовуватися для справжнього редагування на місці , яке не передбачає тимчасового файлу
ex -c ':1d' -c ':wq' file.txt
strace -e open ex -c ':1d' -c ':wq' foo
. ex обрізає оригінальний файл тимчасовим файлом, де опція -i GNU sed замінює оригінал із тимчасовим файлом. Я не впевнений, як працює сім'я BSD.
Ви можете використовувати Vim в режимі Ex:
ex -s -c '1d|x' file.txt
1
знайти перший рядок
d
видалити
x
зберегти і закрити
Ця команда видалить 1 рядок і збереже як "file.txt".
sed '1d' file.txt > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt
Щоб видалити рядок утиліти у файлі
Файл sed '1d'
Файл sed '1d3d'
Видалити шаблону в рядку
1 Видаліть перші два статути в ліні
Файл 's /^..//'
2 Видаліть останні два рядки крекрецину
Файл sed 's / .. £ //'
3 Видаліть порожній рядок
Файл Sed '/ ^ £ / d'
£
≠ $
.
файл кішки01 | sed -e '1,3d'
// показати вміст у file01, але видалити перший та третій рядок
sed
ви можете користуватисяsed -i .bak '1d' file.txt
.