sed +特定の行を一致させた後に複雑な行を追加する方法

sed +特定の行を一致させた後に複雑な行を追加する方法

- で始まる行と一致する行の後にsedを追加したいと思います。次のような複雑な行です。number_of_cars_are

more /tmp/orig_file

number_of_cars_are=$number_of_cars_are

追加したい行は次のとおりです。

numbers=` su hdfs -c "hdfs dfs -ls  $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `

だから私たちは次のことをしました。

sed '/^[[:space:]]*number_of_cars_are =.*/a numbers=` su hdfs -c "hdfs dfs -ls  $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `' /tmp/orig_file > /tmp/new_file

しかし、我々は次のような結果を得る

sed: can't read /g | awk {print: No such file or directory
sed: can't read } | wc -m `: No such file or directory

それで私たちはバックスラッシュも追加してみました。

sed '/^[[:space:]]*number_of_cars_are =.*/a numbers=` su hdfs -c \"hdfs dfs -ls  $var/*.jar\" |sed s'/\// /g' | awk '{print \$NF}' | wc -m `' /tmp/orig_file > /tmp/new_file

しかし、同じように

sed: can't read /g | awk {print: No such file or directory
sed: can't read $NF} | wc -m `: No such file or directory

行を追加する方法に関する提案

ベストアンサー1

シェルが追加の行の(必要な)特殊シンボルを解釈しないように、Sedコマンドをファイルに配置するのが最善です。

longline.sed:

/^[[:space:]]*number_of_cars_are=/a\
numbers=` su hdfs -c "hdfs dfs -ls  $var/*.jar" |sed s'/\\// /g' | awk '{print $NF}' | wc -m `

Sedはエスケープ文字を解釈するので、唯一の修正はバックスラッシュをエスケープすることです。

$ sed -f longline.sed newfile
more /tmp/orig_file

number_of_cars_are=$number_of_cars_are
numbers=` su hdfs -c "hdfs dfs -ls  $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `

おすすめ記事