Sed скрипт для удаления первых двух строк файла, если они пусты - PullRequest
4 голосов
/ 29 февраля 2012

Я пытаюсь написать довольно лаконичный сценарий sed для удаления первых двух строк файла , только если они пусты, поэтому следующий файл:

> cat myfile.in


Line 3

Line 5

БудетВ результате получается файл из трех строк:

> cat myfile.out
Line 3

Line 5

Это включает в себя объединение диапазонов строк и сопоставление с образцом, и я просто не могу найти никаких примеров этого.Я также был бы заинтересован, если бы кто-нибудь мог предложить и в равной степени (или более) предложить альтернативу Perl.Большое спасибо.

Сноска

Я должен добавить, что я попробовал 1,2{/^$/d}, который работал абсолютно нормально в Linux, но под AIX я получил:

sed: 0602-404 Function 1,2{/^$/d} cannot be parsed.

и в Solaris я получил:

sed: command garbled: 1,2{/^$/d}

Это удар, потому что этот код должен работать как в AIX, так и в Solaris, но не в Linux!Позор!

Ответы [ 7 ]

8 голосов
/ 29 февраля 2012

Вот один из способов сделать это в Perl:

perl -ne 'print if $. > 2 or $_ ne "\n"' <myfile.in >myfile.out

Если вы хотите разрешить дополнительные пробелы в пустых строках:

perl -ne 'print if $. > 2 or /\S/' <myfile.in >myfile.out

Эта следующая версия делает что-то немного другое. Удаляет только начальные пустые строки (до 2). Если первая строка не пуста, а вторая - обе строки будут напечатаны. (Я думал об этом, прежде чем вы ответили на мой комментарий, и мне это нравится, и у следующего человека, который сталкивается с этим вопросом, могут быть другие требования.)

perl -ne 'print if $started ||= $. > 2 || /\S/'

$started ||= означает, что как только печать начнется, она не остановится.

3 голосов
/ 29 февраля 2012

Не монах Perl, но я бы сделал это на Perl (возможно, есть лучший способ):

$_ = <> or exit 0; print unless /^\s*$/;
$_ = <> or exit 0; print unless /^\s*$/;
print while <>;
2 голосов
/ 29 февраля 2012

Это может работать для вас:

sed -e '1{/^$/d}' -e '2{/^$/d}' file
2 голосов
/ 29 февраля 2012

Я думаю, что это должно работать с sed (если вы хотите удалить обе первые строки, если обе пустые):

sed '1,1{N;/^\n$/d}'

т.е.: 1,1 = перейти к первой строке, N = добавить следующую строку к пробелу, ^\n$/d = удалить эти две строки, если они пусты.

Если вы хотите удалить первые две строки, если они пусты (независимо от другой строки), вы можете сделать:

sed '1,2/^$/d'
2 голосов
/ 29 февраля 2012

Это можно сделать простым скриптом на awk, например:

awk 'NR>2 || $0 != ""' file.txt

РЕДАКТИРОВАТЬ: Поскольку awk не считался принятым инструментом для решения этой проблемы, есть одна команда sed, которая работает на Mac и Linux одновременно:

sed '/^$/{1,2d;}' file.txt

OR

sed '1,2s/^$/~@#%-=/; /^~@#%-=$/d' file.txt

Предполагается, что файл не имеет строки ~@#%-= (которую можно изменить на любой другой произвольный текст).

0 голосов
/ 29 февраля 2012

Вы можете использовать текстовый редактор ed:

$ echo -e '1,2g/^$/d\n%p' | ed -s input.txt

Если вы хотите сохранить результат: (измените %p на w)

$ echo -e '1,2g/^$/d\nw' | ed -s input.txt
0 голосов
/ 29 февраля 2012

Вы можете сделать это в awk следующим образом

cat 1.txt | awk '{if(NR>2){print $0;}}'
...