0

これを含むファイル 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' に変更します。

4

2 に答える 2

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

これにより、すべての例のように最後だけでなく、最初の文字列内のどこにでも「server」を表示できます。最後にのみ必要な場合は、2 番目の を省略し[^"]*ます。

ああ、「二重引用符やバックスラッシュを使用しない」という要件に対処するには:

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

違いは、否定された文字クラスのバックスラッシュです。

于 2012-12-16T07:20:54.573 に答える
1
cat dummy.txt | perl -pe 's{ ^ (" [^"\\]* server [^"\\]* " \\1 \\") [^"\\]+ " $}{${1}tbone"}xms;'

Perl バージョンの方が少し読みやすいです。

于 2012-12-16T10:28:11.177 に答える