sed命令编辑给定规则的流

时间:2012-05-17 11:37:08

标签: shell sed awk tr

我有一个像这样的输入流:

afs=1;bgd=1;cgd=1;djh=1;fgjhh=1;

现在我必须编辑流的规则是: (1)如果我们有

"djh=number;"

替换为

"djh=number,"

(2)否则将

"string,"

我可以将案例2处理为:

sed 's/afs=1/afs,/g;s/dbg=1/dbg,/g;..... so on for rest

如何照顾病情1?

“djh”号码可以是任意数字(1,12,100),其他数字总是1。

我使用的所有双引号仅供参考;输入流中不存在双引号。 “afs”也可以是“Afs”。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

sed -e 's/;/,/g; s/,djh=/,@=/; s/\([a-z][a-z]*\)=[0-9]*,/\1,/g; s/@/djh/g'

以下是

  1. 将所有;替换为,
  2. djh替换为@
  3. 从所有下方字符串中删除=number
  4. @替换为djh
  5. 这会导致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'