sed:替换任意次数出现的某种模式

sed:替换任意次数出现的某种模式

鉴于此输入:

 "hell -- 'this -- world --is'-- beautiful' --thanks-- we'-- are-- here" 

我想使用 用 'XXX' 替换单引号之间的每个 '--' sed。它应给出以下输出:

输出:“地狱--‘这个XXX世界XX-Xis’--美丽‘XX-X感谢XXX我们’--在这里”

替换的次数可能是未知的(最多为无穷大)。

答案1

您想在末尾使用 /g 开关来解析每行多个替换。

sed s/--/X-X-X/g

答案2

编辑:

使用您的新要求:

sed 's/\o47[^\o47]*\o47/\n&\n/g;:a;s/\(\n\o47[^\n]*\)--/\1X-X-X/;ta;s/\n//g' input file

编辑2:

对于某些sed不喜欢分号的版本:

sed -e 's/\o47[^\o47]*\o47/\n&\n/g' -e ':a' -e 's/\(\n\o47[^\n]*\)--/\1X-X-X/' -e 'ta' -e 's/\n//g' inputfile

如果您sed也不支持八进制转义码:

sed -e "s/'[^']*'/\n&\n/g" -e ':a' -e "s/\(\n'[^\n]*\)--/\1X-X-X/" -e 'ta' -e 's/\n//g' inputfile

原始答案:

通常,您应该使用单引号将sed脚本括起来,这样就不必转义 shell 中的特殊字符。尽管在这种情况下没有必要这样做,但养成一个好习惯还是不错的。

sed 's/--/X-X-X/g' inputfile

或者

var="hell --this -- world is --beaut--iful"
newvar=$(echo "$var" | sed 's/--/X-X-X/g')

不使用g修饰符时,将对输入的每一行中的第一个匹配项执行替换。g使用修饰符时,将替换输入的每一行中的每个匹配项。您还可以对特定匹配项执行替换:

$ var="hell --this -- world is --beaut--iful"
$ echo "$var" | sed 's/--/X-X-X/2'
hell --this X-X-X world is --beaut--iful

答案3

$ echo "hell --this -- world is --beaut--iful" | sed s"/--/X-X-X/g"
hell X-X-Xthis X-X-X world is X-X-XbeautX-X-Xiful

关键在于g开关:它会导致sed所有出现的事件被替换。

答案4

echo "     -- hell     -- this ------   world       ---- test"  |\
sed -r 's/[ ]+[-]+[ ]+/ x-x-x /g'

给出:

 x-x-x hell x-x-x this x-x-x world x-x-x test

加号匹配括号内的字符序列重复一次或多次。

相关内容