Как заменить определенную строку в текстовом файле пустым пространством

Аргументом doявляется одна команда; дальнейшие команды используют цепочку команд.

while true ; do date ; find... ; sleep 3600 ; done
1
23.07.2020, 08:45
1 ответ

Как glob , *.tar.gzозначает любую строку, оканчивающуюся на .tar.gz. Sed, однако, не использует подстановочные знаки , он использует регулярные выражения , а регулярные выражения имеют другой синтаксис. Попробуйте:

sed -i -e 's/\/[^/]*\.tar\.gz//g' copyright

В приведенном выше примере регулярное выражение \/соответствует всему, что начинается с /(, поскольку /используется в качестве делителя sed, мы экранируем его как \/), за которым следует [^/]*, что соответствует нулю или больше любого символа, кроме /, за которым следует .tar.gz, где .экранированы, чтобы они соответствовали только точкам. (В обычной нотации регулярных выражений .соответствует любому одному символу.)

Существует много различий между подстановками (, используемыми оболочкой ), и регулярными выражениями (, которые используются sed, grep и другими важными инструментами ). В глобусе .означает точку. В регулярном выражении .— это подстановочный знак, означающий любой одиночный символ. В глобусе *означает ноль или более любых символов. В регулярном выражении *означает ноль или более предыдущей вещи .

Дополнительная тема

Нам не нужно использовать /в качестве разделителя в команде подстановки sed. Возможны и другие делители, такие как@:

sed -i -e 's@/[^/]*\.tar\.gz@@g' copyright

Поскольку в приведенном выше примере мы используем @в качестве делителя вместо /, нам не нужно избегать первого /.

3
18.03.2021, 23:17

Теги

Похожие вопросы