Find / sed: Как я могу рекурсивно искать / заменять строку в файлах, но только для строк, которые соответствуют определенному регулярному выражению - PullRequest
3 голосов
/ 06 марта 2012

Мне известно, что следующую команду можно использовать для рекурсивной замены всех экземпляров определенной строки другой:

find / path / to / files -type f -print0 |xargs -0 sed -i 's / oldstring / newstring / g'

Однако мне нужно делать это только для строк, начинающихся с определенной строки ("matchstr").

ДляНапример, если файл содержит следующие строки:

This line containing oldstring should remain untouched
matchstr sometext oldstring somethingelse

Я хочу получить это в качестве вывода:

This line containing oldstring should remain untouched
matchstr sometext newstring somethingelse

Любые предложения относительно того, как я мог бы действовать, были бы оценены.

Ответы [ 2 ]

6 голосов
/ 06 марта 2012

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

sed -i '/^matchstr/{s/oldstring/newstring/g}'

т.е.

find /path/to/files -type f -print0 | \
  xargs -0 sed -i '/^matchstr/{s/oldstring/newstring/g}'

Первый /^matchstr/ ищет строки, соответствующие этому регулярному выражению, и для этих строк выполняется s/old/new/g.

4 голосов
/ 06 марта 2012

Вы можете сделать это легко, используя sed:

sed -e '/^matchstr/ s/oldstring/newstring/g' inputfile

/^matchstr/ действует как условие; он заставляет выполнять следующий блок, только если регулярное выражение совпадает. В этом случае мы ищем matchstr в начале строки.

...