私はこれをcat
してからsed
操作をしています:
cat ${location_x}/file_1 > ${location_y}/file2
sed -i "s/0/1/g" /${location_y}/file2
これは1行で実行できますか?
私はそのような方法を見逃すかもしれません here ですが、その説明はそれとは逆に対処するように思えます、そして私も失敗して上記のcat
とsed
を統合します2つのアンパサンド(&&
)またはセミコロン(;
)そしてそれは不可能だと思い込んで近づきますが、私が間違っているかもしれないので、ここで尋ねることは重要です。
すべての読者が英語を話す人ではないため、「アンパサンド」または「セミコロン」という用語に精通しているため、これらについて詳しく説明しました。
はい:
sed 's/0/1/g' "$location_x/file_1" >"$location_y/file2"
コードは最初に最初のファイルのコピーを作成し、次にsed -i
を使用したインライン編集を使用してコピーを変更します。上記のコードは、元のファイルから読み取り、変更を行い、結果を新しいファイルに書き込みます。ここではcat
は必要ありません。
GNU sed
を使用していて、$location_x
に先頭に-
を含めることができる場合は、パスが正しくないことを確認する必要があります。コマンドラインフラグとして解釈されます:
sed -e 's/0/1/g' -- "$location_x/file_1" >"$location_y/file2"
二重ダッシュは、コマンドラインオプションの終わりを示します。もう1つの方法は、<
を使用して、ファイルの内容をsed
にリダイレクトすることです。その他のsed
実装(BSD sed
)は、オプションの最初の非引数でコマンドラインの解析を停止しますが、GNU sed
(他の一部のGNUソフトウェア)は、コマンド行を解析する際に再配置します。
この特定の編集操作(すべて0を1に変更)では、以下も機能します。
tr '0' '1' <"$location_x/file_1" >"$location_y/file2"
tr
は常に標準入力から読み取るため、<
は元のファイルから入力をリダイレクトすることに注意してください。
sed
コマンドラインで/${location_y}/file2
にアクセスしようとしていますが、これはその上の行のパス(パスの先頭の/
)とは異なります。これはタイプミスかもしれません。
tee
を別のアプローチに使用する代替ソリューション:
cat "${location_x}/file1" |\
tee "${location_y}/file2" |\
sed -i "s/0/1/g"
次のことを行います。
-cat
:${location_x}/file1
を読み取り、tee
にパイプします
-tee
:cat
から${location_y}/file2
に入力を書き込み、それをsed
にパイプします
-sed
:sed
からの入力でtee
を実行します
オプション:sed
からの出力をファイルに書き込む場合は、> /path/to/file
を追加して上書きするか、>> /path/to/file
を追加して追加します。