我有一个包含此文件的文件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'
答案 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版本稍微更具可读性。