Подтвердить что ты не робот

Заменить, только если строка существует в текущей строке

У меня есть строка, например:

sed -i 's/mystring/newstring/' $target

Эта команда изменит все mystring на newstring.

Теперь я хочу: когда программа видит mystring, как я могу проверить текущую строку, если строка searchstring существует или нет? Если он существует, newstring - 1; в противном случае newstring 0.

4b9b3361

Ответ 1

Решение

Предполагая, что ваш целевой файл $target содержит следующее:

some text mystring some other text
some text mystring a searchstring
just some more text

Эта команда:

sed -i -e '/searchstring/ s/mystring/1/ ; /searchstring/! s/mystring/0/' $target

изменит свой контент на:

some text 0 some other text
some text 1 a searchstring
just some more text

Описание

script содержит две команды подстановки (s), разделенные точкой с запятой.

Подставляемая команда принимает дополнительный диапазон адресов, который выбирает строки, которые должна выполняться подстановкой.

В этом случае адрес regexp использовался для выбора строк, содержащих строку поиска для первой команды; и строки, которые не содержат строку поиска (обратите внимание на восклицательный знак после того, как regexp отрицает совпадение) для второго.

Изменить

Эта команда будет работать лучше и даст тот же результат:

sed -i -e '/searchstring/ s/mystring/1/ ; s/mystring/0/' $target

Дело в том, что команды выполняются последовательно и, таким образом, если в текущей строке по-прежнему есть подстрока мистика после завершения первой команды, то в ней нет уверенной строки поиска.

Престижность пользователя946850.

Ответ 2

Это из sed one-liners страница:

ОПТИМИЗАЦИЯ ДЛЯ СКОРОСТИ: Если необходимо увеличить скорость выполнения (из-за большие входные файлы или медленные процессоры или жесткие диски), замена будет выполняться быстрее, если выражение "найти" указано до давая инструкцию "s/.../.../". Таким образом:

sed 's/foo/bar/g' filename         # standard replace command
sed '/foo/ s/foo/bar/g' filename   # executes more quickly
sed '/foo/ s//bar/g' filename      # shorthand sed syntax

Скорость не является проблемой вопроса, но подсказки синтаксиса помогают сформулировать решение:

sed -i '/searchstring/ s/mystring/1/; s/mystring/0/' $target