Помощь с комбинированием команд sed (синтаксис)

Помощь с комбинированием команд sed (синтаксис)

У меня есть файл, содержащий много строк, например, таких:

, foo = $true
, foo = $false
foo = $true, <--- single space after comma
foo = $false, <-- single space after comma

Чтобы заменить эти строки, я могу сделать

#!/bin/bash

sed -i 's/, foo = $true/bar/g' file
sed -i 's/, foo = $false/bar/g' file
sed -i 's/foo = $true, /bar/g' file
sed -i 's/foo = $false, /bar/g' file

или приковать их цепями, что так же плохо

sed -i -e 's/, foo = $true/bar/g' -e 's/, foo = $false/bar/g' -e 's/foo = $true, /bar/g' ... file

Но есть ли способ использовать одну команду sed для выполнения всех итераций?

sed -i 's/[,\ ].*foo = [$false\|$true][,\ ]/bar/g' file

решение1

sed -Ei 's/,{,1} {,1}foo = \$(true|false),{,1} {,1}/bar/g' file
sed -Ei 's/(, ){,1}foo = \$(true|false)(, ){,1}/bar/g' file

-Eфлаг активирует расширенные регулярные выражения, которые позволяют использовать (){}|метасимволы без экранирования.

  • (, ){,1}соответствует от 0 (подразумевается) до 1 вхождению ,.

  • \$(true|false)совпадения $trueили $false.


Имейте в виду, что

sed -i -e 's/, foo = $true/bar/g' -e 's/, foo = $false/bar/g' -e 's/foo = $true, /bar/g' ... file

это одна команда sed, но с различными скриптами (по одному для каждого -eфлага).

Связанный контент