Использование sed только между определенными строками
У меня есть эта команда sed для удаления пробелов после запятых.
sed -e 's/,s+/,/g' example.txt
Как я могу изменить это, это сделает модификацию только между конкретными номерами строк.
(например, между второй и третьей строках).
3 ответов
поскольку OSX (BSD sed) имеет некоторые синтаксические различия с linux (GNU) sed, я подумал, что добавлю следующее из моих с трудом выигранных заметок:
OSX (BSD) sed найти/заменить в блоке (адрес) (шаблоны начальной и конечной точек(/../ ) или строка #s) в том же файле (via & via & via & раздел 4.20 здесь):
синтаксис:
$ sed '/start_pattern/,/end_pattern/ [operations]' [target filename]
стандартный поиск / замена примеры:
$ sed -i '' '2,3 s/,\s\+/,/g' example.txt
$ sed -i '' '/DOCTYPE/,/body/ s/,\s\+/,/g' example.txt
Find / replace example with complex operator and grouping (не может работать без синтаксиса группировки из-за использования потока стандартного ввода). Все операторы в группировке должны быть на отдельных строках или разделены полуколонами:
пример сложного оператора (удалит всю строку, содержащую совпадение):
$ sed -i '' '2,3 {/pattern/d;}' example.txt
Multi-file find + sed:
$ find ./ -type f -name '*.html' | xargs sed -i '' '/<head>/,/<\/head>/ {/pattern/d; /pattern2/d;}'
надеюсь, это поможет кому-то!
sed -e '2,3!b;s/,\s\+/,/g' example.txt
эта версия может быть полезна, если позже вы захотите добавить больше команд для обработки нужных строк.