(O+P)ut

OutPut Log by SE in SIer



(O+P)ut

Output Log by SE

sedコマンドで特定箇所に一括で追記する

スポンサーリンク

事象

あるスクリプトに数箇所ある以下文言に

awk -F '"' '{print $(NF-1)}' 

head -n 1を追記して

awk -F '"' '{print $(NF-1)}' | head -n 1

としたい。

実施コマンド

該当のスクリプトをhoge.shとすると以下コマンドで標準出力されます。
ちなみにリダイレクト名として間違ってもhoge.shを出力先にしないでください。ファイルが消えます。

$ cat hoge.sh  | sed s/"\$(NF-1)}'"/"\$(NF-1)}' | head -n 1"/g
....
awk -F '"' '{print $(NF-1)}' | head -n 1
....

補足

$(NF-1)}' を $(NF-1)}' | head -n 1 に置換します。

一括で置換するコマンドである以下を実施しますが適切なエスケープが必要です。

sed s/変更前/変更後/g

今回は'$が対象です。

以下にエスケープを行う試行錯誤を参考として記載しておきます。

コマンド実施例

以下をechoで出力するのも実は一苦労です。

awk '{print $0" "}'

そのままechoすると'が外れます。

# echo awk '{print $0" "}'
awk {print $0" "}

'をエスケープすると次は$0が特殊変数であるシェルスクリプトのファイルパスとして表示されます。

# echo awk \'{print $0" "}\'
awk '{print bash }'

$をエスケープすると次は"がなくなります。

# echo awk \'{print \$0" "}\'
awk '{print $0 }'

ここまでエスケープしてやっと該当の文字列が表示されます。

# echo awk \'{print \$0\" \"}\'
awk '{print $0" "}'


以上、表題の一括追記処理を行いたい方の参考になれば幸いです。


他の記事を読む