sed正则表达式取代solaris

时间:2012-12-16 06:43:41

标签: bash shell unix sed solaris

我有一个包含此文件的文件dummy.txt:

"my_server"\1\"n9j7gd8kl4"
"widget"\1\"vnhck67hn"
"other_server"\1\"tbone"
"blah"\1\"n9j7gd8kl4"
"server_new"\1\"g54"
"genserver"\1\"vf45s"
"prd+other_server"\1\"f"\"jh34t"
"test_blah"\1\"tbone"

我需要在Solaris中使用类似通用的单行程序将其更改为此(有人可以帮忙吗?):

"my_server"\1\"tbone"
"widget"\1\"vnhck67hn"
"other_server"\1\"tbone"
"blah"\1\"n9j7gd8kl4"
"server_new"\1\"tbone"
"genserver"\1\"tbone"
"prd+other_server"\1\"f"\"jh34t"
"test_blah"\1\"tbone"

即。对于第一个双引号中包含字符串'server'的每一行,该行的格式为“string1”\ 1 \“string2”,然后将string2的值更改为'tbone'

2 个答案:

答案 0 :(得分:3)

sed 's/^\("[^"]*server[^"]*"\\1\\\)".*"$/\1"tbone"/'

这允许'server'出现在第一个字符串中的任何位置,而不是像所有示例中那样出现在最后。如果您最后只想要它,请省略第二个[^"]*

哦,并且要处理'没有双引号或反斜杠'的要求:

sed 's/^\("[^\\"]*server[^\\"]*"\\1\\\)"[^\\"]*"$/\1"tbone"/'

区别在于否定字符类中的反斜杠。

答案 1 :(得分:1)

cat dummy.txt | perl -pe 's{ ^ (" [^"\\]* server [^"\\]* " \\1 \\") [^"\\]+ " $}{${1}tbone"}xms;'

Perl版本稍微更具可读性。