我有一个像这样的输入流:
afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;
现在我必须编辑流的规则是: (1)如果我们有
"djh=number;"
替换为
"djh=number,"
(2)否则将 我可以将案例2处理为: 如何照顾病情1? “djh”号码可以是任意数字(1,12,100),其他数字总是1。 我使用的所有双引号仅供参考;输入流中不存在双引号。 “afs”也可以是“Afs”。
提前谢谢。"string,"
sed 's/afs=1/afs,/g;s/dbg=1/dbg,/g;..... so on for rest
答案 0 :(得分:1)
sed -e 's/;/,/g; s/,djh=/,@=/; s/\([a-z][a-z]*\)=[0-9]*,/\1,/g; s/@/djh/g'
以下是
;
替换为,
djh
替换为@
=number
@
替换为djh
这会导致afs,bgd,cgd,djh=1,fgjhh,
输入。当然,您可以将djh替换为任何其他字符,以便于匹配其他字符串。这只是说明了这个想法。
答案 1 :(得分:0)
这可能对您有用:
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/
ta
s/\n\([^=]*\)=1;/\1,\n/
ta
s/.$//
或:
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
\n
异常字符串s/\n\([^;]*\);/djh=\1,/g
N.B。替换异常字符串时,请确保它从单词边界\<
答案 2 :(得分:0)
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'