'$int'
— это ошибка цитирования, которую вы бы легко заметили, если бы запускали скрипт через
bash -vx schript.sh
В одинарных кавычках нет расширения. Вам нужно:
if [ "$int" -lt 0 ]
Это то, что вы ищете? С ГНУsed
:
sed -E 's/(command1|command2|command3)/true/' file
Если ваш 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/
, или команды tr
tr 'abm|' 'xxxx'
и tr 'abm|' '[x*4]'
.
POSIXly вы можете использоватьawk
:
awk '{gsub(/command1|command2|command3/, "true"); print}' < file
Однако (sed -E
, скорее всего, будет определено в следующем основном стандарте POSIX , поэтому, вероятно, в конечном итоге он распространится на большинство реализаций ).