4

入力ファイル

..
set name "old name"; # comment "should be updated"
..

出力ファイル

..
set name "new name" ; #comment "should be updated"
..

grep -i 'name' inputfile | grep -P \".+{\"} 最初の「」と「最後の」の間のコンテンツをgrepして、引用符の間のコンテンツをgrepしようとしたとき

すなわち old name"; # comment "should be updated

grepsedまたはawk!を使用してそれを達成するための任意のアイデア

4

3 に答える 3

8

あなたが何をしようとしているのか正確にはわかりません。一つには、grepコマンドには中括弧が含まれていますが、入力には含まれていません。また、入力と出力の比較に基づいて置換を行いたいようです。

ただし、文字通り質問を取り上げるとgrep、引用符の間に文字列を含める方法は次のとおりです。欲張りでないマッチングを使用できます。

grep -Po '".*?"'

例:

$ echo 'set name "username"; # comment "should be updated"' | grep -Po '".*?"'
"username"
"should be updated"

編集:

値を置き換えるには、を使用できますsed。は使用しませんgrep

sed 's/"[^"]*"/"new name"/'

例:

$ echo 'set name "old name"; # comment "should be updated"' | sed 's/"[^"]*"/"new name"/'
set name "new name"; # comment "should be updated"
于 2012-04-18T16:19:40.033 に答える
7

セド:

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

ぎこちない:

awk -F'"' '{ print $2 }'
于 2012-04-18T15:27:02.810 に答える
1

後の単語should beが新しいユーザー名になるはずだと思います

sed 's/^\([^"]\+"\)[^"]\+\(.*should be \)\([^"]\+\)/\1\3\2\3/' 

GNU sed で少し整頓

sed -r 's/^([^"]+")[^"]+(.*should be )([^"]+)/\1\3\2\3/'

編集- デニスには良い答えがあります。新しい名前がシェル変数に保持されている場合は、引用のトリックを使用できます。

new_name="Fred"
sed 's/"[^"]*/"'"$new_name"'"/'
于 2012-04-18T15:38:52.603 に答える