テキストファイルの特定の行の行番号に置き換える

テキストファイルの特定の行の行番号に置き換える

Bashで私がしなければならないのは、テキストファイルの2行目の特定の文字をそのファイルの行数に置き換えることです。したがって、これは行数を計算するタスクを実行します。

cat test.csv | wc -l

次のコマンドは、変更中の;0;ファイルで見つかった番号を上記のコマンドで取得した番号に変更します(この場合33)。

sed -i '2s/;0;/;33;/' test.csv

しかし、今私は上記の2つのコマンドを組み合わせて単一のコマンドとして動作しようとしています(私のアプリケーションには必要です)。以下に示すようにいくつかの方法を試しましたが、成功しませんでした。

sed '2s/;0;/`cat test.csv | wc -l`/' test.csv
cat test.csv | wc -l | sed '2s/;0;//' test.csv
sed '2s/;0;/`${cat test.csv | wc -l}`/' test.csv
sed -e '2s/;0;/echo `${cat test.csv | wc -l}`/;e' test.csv
sed -e '2s/;0;/${echo `cat test.csv | wc -l`}/' test.csv
$rn=`cat test.csv | wc -l`; sed '2s/;0;/${rn}/' test.csv

誰でもこの問題を解決するのに役立ちますか?

答え1

すべてのコマンドはsed式の周りに一重引用符を使用します。シェルは一重引用符内では拡張されません。

代わりに(二重引用符コマンドを置き換えるために一重引用符式を一時的に中断)

sed '2s/;0;/;'"$( wc -l <test.csv )"';/' test.csv

または(完全な式に二重引用符を使用)、

sed "2s/;0;/;$( wc -l <test.csv );/" test.csv

または(変数を使用し、上記のように二重引用符を使用)、

lines=$( wc -l <test.csv ); sed "2s/;0;/;$lines;/" test.csv

-i(動作するか分かるまでは使用しないでください!)

関連:

関連情報