Заменить многие строки другой строкой

'$int'— это ошибка цитирования, которую вы бы легко заметили, если бы запускали скрипт через

bash -vx schript.sh

В одинарных кавычках нет расширения. Вам нужно:

if [ "$int" -lt 0 ]
6
10.12.2019, 18:58
3 ответа

Это то, что вы ищете? С ГНУsed:

sed -E 's/(command1|command2|command3)/true/' file
3
27.01.2020, 20:25

Если ваш sedможет использовать нестандартную -опцию -Eдля понимания расширенных регулярных выражений, вы можете использовать

sed -E 's/string1|string2|string3/true/g'

Чередование с |— это функция расширенного регулярного выражения, не поддерживаемая базовым регулярным выражением того типа, который обычно поддерживает sed.

Приведенная выше команда sedзаменит любую из трех заданных строк, даже если они встречаются как подстроки других строк (, таких как string1вstring10).

Чтобы предотвратить это, также сопоставляйте границы слов с обеих сторон:

sed -E 's/\<(string1|string2|string3)\>/true/g'

В macOS вы можете использовать [[:<:]]и [[:>:]]вместо \<и \>, чтобы указать границы слов.


Между прочим, ваше s/[a|b|m]/x/gвыражение (, исправленное в вопросе ), не только заменит a, bи mна x, но также заменит любое |в тексте с x. Это то же самое, что и s/[abm|]/x/gили y/abm|/xxxx/, или команды trtr 'abm|' 'xxxx'и tr 'abm|' '[x*4]'.

6
27.01.2020, 20:25

POSIXly вы можете использоватьawk:

awk '{gsub(/command1|command2|command3/, "true"); print}' < file
Однако

(sed -E, скорее всего, будет определено в следующем основном стандарте POSIX , поэтому, вероятно, в конечном итоге он распространится на большинство реализаций ).

1
27.01.2020, 20:25

Теги

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