5

私はこのような5列のcsvファイル(スペースで区切られています)を持っています:

username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled 20130310 disabled

の4列目の値を変更しようとしていますusername4

私のスクリプトはすでに行番号と保存する新しい値を取得しているので、列4の値を行番号username4に置き換えたいと思います。$newValue$lineNumber

私のサンプルでは:

newValue=anything
lineNumber=4

レンダリングするために:

username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled anything disabled

でインライン変更ができるので、sed代わりに使用する予定です。awksed-i

4

2 に答える 2

15

1 つの方法を次に示します。

$ sed '/^username4/{s/ [^ ]*/ anything/3}' file
username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled anything disabled

# store changes back to the file 
$ sed -i '/^username4/{s/ [^ ]*/ anything/3}' file

しかし、選択肢があるからといって避けるのは正当な理由ではありませんawk。は、この種の問題を処理するのにより適しています。sed-iawk

$ awk '$1=="username4"{$4="anything"}1' file
username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled anything disabled

# store changes back to the file
$ awk '$1=="username4"{$4="anything"}1' file > tmp && mv tmp file

フィールドの比較と編集を簡単に行うことawkができるため、シェル変数を使用することは引用の悪夢ではなく、昨日だけ書いたスクリプトを理解することはそうではなく、次の場合とは異なりsedます。

$ linenumber=4

$ newvalue=anything 

$ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file 
username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 20130320 disabled 20130321 enabled
username4 20130310 disabled anything disabled

$ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file > tmp && mv tmp file
于 2013-03-21T20:20:15.567 に答える
2

これはあなたのために働くかもしれません(GNU sed&Bash):

lineNumber=4 newValue=xxxx sed -i ${lineNumber}'s/\S\+/'"${newValue}"'/4' file

ただし注意。newValueに a が含まれている場合/は、代替コマンド区切り文字を別のものに変更する必要があります。s@\S\+@${newValue}@4

于 2013-03-22T11:36:51.370 に答える