我有一个这样的输入流:
afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;现在我必须编辑这个流的规则是:(1)如果我们有
"djh=number;"将其替换为
"djh=number,"(2)否则将“string=number;”替换为
"string,"我可以这样处理第二种情况:
sed 's/afs=1/afs,/g;s/dbg=1/dbg,/g;..... so on for rest如何处理条件1?
"djh“数字可以是任何数字( 1,12,100),其他数字始终为1。
我使用的所有双引号仅供参考;输入流中没有双引号。"afs“也可以是"Afs”。提前谢谢。
发布于 2012-05-17 20:01:16
sed -e 's/;/,/g; s/,djh=/,@=/; s/\([a-z][a-z]*\)=[0-9]*,/\1,/g; s/@/djh/g'这将执行以下操作
使用带有djh的所有低机箱strings
,=number替换,@中的所有;这将为您的输入生成afs,bgd,cgd,djh=1,fgjhh,。当然,您可以用任何其他字符替换djh,这样可以更容易地匹配其他字符串。这仅仅是为了说明这个想法。
发布于 2012-05-17 20:01:35
这可能对你有用:
echo "afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;" |
sed 's/^/\n/;:a;/\n\(djh=[0-9]*\);/s//\1,\n/;ta;s/\n\([^=]*\)=1;/\1,\n/;ta;s/.$//'
afs,bgd,cgd,djh=1,fgjhh,解释:
该方法使用一个惟一的标记(\n是一个很好的选择,因为它不能出现在模式空间中,因为它被sed用作行分隔符)作为锚点,以便在整个输入字符串中进行比较。它速度很慢,但如果需要多个异常,它可以扩展。
将标记放在字符串s/^/\n/
:a
/\n\(djh=[0-9]*\)//s//\1,\n/tas/\n\([^=]*\)=1;/\1,\n/tas/.$//或者:
echo "afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;" |
sed 's/\<djh=/\n/g;s/=[^;]*;/,/g;s/\n\([^;]*\);/djh=\1,/g'
afs,bgd,cgd,djh=1,fgjhh,解释:
这很快,但不能扩展到多个异常:
将异常字符串替换为新行s/\<djh=/\n/g
s/=[^;]*;/,/g
s/\n\([^;]*\);/djh=\1,/g
替换\n
注意:替换异常字符串时,请确保它以单词边界\<开头
发布于 2012-05-17 20:01:35
echo 'afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;' |
sed -e 's/\(djh=[0-9]\+\);/\1,/g' -e 's/\([a-zA-Z0-9]\+\)=1;/\1,/g'https://stackoverflow.com/questions/10634991
复制相似问题