2010-11-22 4 views

ответ

1
sed -i 's/third//g' my.txt 

бы изменить файл на месте.

+2

Это не будет удалить строку, она будет просто заменить «третье» с пустой строкой. –

+0

@Sean: Действительно; Думаю, я неправильно понял вопрос. –

2

Вы можете сделать:

sed -i -r '/^(third|)$/d' my.txt 
+0

Это использует расширенное регулярное выражение, которое стандарт (POSIX) «sed» не поддерживает. Это не так - это просто расширение, которое следует отметить. –

4

Использование GNU СЭД, перезапись тривиальна с опцией '-i'; используя стандартный sed, вы должны записать во временный файл и затем скопировать его поверх оригинала.

Другие ответы предшествуют заданию «пустые строки» в вопросе.

sed -i '/third/d;/^[ ]*$/d' my.txt 

Первая часть команды, вплоть до запятой, выглядит для «третьего» и удаляет любую соответствующую строку. Вторая часть команды ищет любую строку, состоящую из нуля или более пробелов, и удаляет их. Если вы хотите удалить строки с пробелами и вкладками, добавьте вкладку в класс символов - нет удобного способа отображения вкладок на языке разметки SO.

Вы могли бы то же самое написать:

sed -i -e '/third/d' -e '/^[ ]*$/d' my.txt 

И для не-GNU СЭД, вы должны использовать:

sed '/third/d;/^[ ]*$/d' my.txt > x.$$ 
cp x.$$ my.txt 
rm -f x.$$ 
+0

Без GNU sed альтернативным способом является использование plain 'ed'. Хотя команды одинаковы, общий синтаксис отличается. – mouviciel

+0

Вы можете использовать '\ t' в своем символьном классе (' [\ t] ') или использовать' [[: blank:]] '(пробел или табуляция) или' [[: space:]] '(в POSIX locale: space, tab, newline, возврат каретки, вкладка формы и вертикальная вкладка. В последнем примере лучше сделать 'sed ... && cp ...', поэтому исходный файл не будет потерян, если 'sed' –

+0

@Dennis: Вероятно, вы правильно указали '' \ t' 'для GNU sed, однако стандарт POSIX не распознает/не отвечает и не поддерживает Solaris 10 (но не одну платформу, где GNU sed не является по умолчанию). По-видимому, Solaris 10 sed, похоже, распознает «[[: blank:]]» и т. д., но, похоже, не действует на них. Весь мир не использует GNU. Вы правы в условной копии. –

0

sed является редактором поток, т.е. для редактирования потоков (трубы), а не файлы. Если вы хотите редактировать файлы, вы должны использовать редактор файлов, таких как ed:

ed my.txt <<-HERE 
    ,g/^third$/d 
    ,g/^$/d 
    w 
    q 
HERE 
+0

Каково значение запятых, предшествующих глобальным командам? –

+0

@ Джонатан Леффлер: Это адрес. 'A, b' означает« из строки 'a' в строка 'b'". Значение по умолчанию для 'a' равно' 1', значением по умолчанию для 'b' является' $ ', т. Е. Последняя строка. Ergo, ',' означает "от строки' 1' до последней строки ", IOW весь файл. Поскольку 'ed' является файловым редактором, он может фактически перемещаться в файле, поэтому все команды принимают адрес. 'sed' OTOH не может рассчитывать на это, потому что вы вообще не можете вернуться назад в поток. –

+0

OK: Я всегда просто использовал 'g/^ third $/d', потому что область глобального поиска - это весь файл, если вы не указали иначе. Если бы я хотел ограничить операцию предыдущей строкой, начинающейся с «x», следующей строкой, начинающейся с «z», например, '?^X?,/^ Z/g/^ third $/d'. Но мне не пришло в голову добавить запятую - и я, вероятно, не буду в тех странных случаях, когда я использую «ed». –

Смежные вопросы