web-dev-qa-db-ja.com

一緒に猫を飼い、一緒にセッドする方法は?

私はこれをcatしてからsed操作をしています:

cat ${location_x}/file_1 > ${location_y}/file2
sed -i "s/0/1/g" /${location_y}/file2

これは1行で実行できますか?

私はそのような方法を見逃すかもしれません here ですが、その説明はそれとは逆に対処するように思えます、そして私も失敗して上記のcatsedを統合します2つのアンパサンド(&&)またはセミコロン(;)そしてそれは不可能だと思い込んで近づきますが、私が間違っているかもしれないので、ここで尋ねることは重要です。

すべての読者が英語を話す人ではないため、「アンパサンド」または「セミコロン」という用語に精通しているため、これらについて詳しく説明しました。

8
user9303970

はい:

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にアクセスしようとしていますが、これはその上の行のパス(パスの先頭の/)とは異なります。これはタイプミスかもしれません。

21
Kusalananda

teeを別のアプローチに使用する代替ソリューション:

cat "${location_x}/file1" |\
  tee "${location_y}/file2" |\
  sed -i "s/0/1/g"

次のことを行います。

-cat${location_x}/file1を読み取り、teeにパイプします

-teecatから${location_y}/file2に入力を書き込み、それをsedにパイプします

-sedsedからの入力でteeを実行します

オプション:sedからの出力をファイルに書き込む場合は、> /path/to/fileを追加して上書きするか、>> /path/to/fileを追加して追加します。

1
Stan Strum