鉴于此输入:
"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
加号匹配括号内的字符序列重复一次或多次。