我有一个包含很多行的文件,就像这样
, 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
flag 激活扩展正则表达式,允许使用(){}|
元字符而无需转义。
(, ){,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
标志一个)。