aを2行目に置き換えてパイプラインを続行するにはどうすればよいですか?

aを2行目に置き換えてパイプラインを続行するにはどうすればよいですか?

まだBashに初めて触れたので疲れた一週間でした。私は今までそれが好きで、長いチェーンチューブが本当に好きです。しかし、私が気づいたのは、STDOUTを変数として使用する必要がある場合はパイプを切断する必要があるということです。

例は次のとおりです。

echo -e 'Going to the movies can be fun.
When a dog found a cat a trouble began.
Do not text while driving please.' > example

2行目のすべての「A」を「THE」に変更したいとしましょう。これが私が現在やっていることです。

cat example | head -2 | tail -1 | sed 's/ a / the /g'

これが私が望む方法です。

# None of these work
cat example | head -2 | tail -1 | ${xargs//a /the } 
cat example | head -2 | tail -1 | ${cat//a /the }
cat example | head -2 | tail -1 | ${$0//a /the }
cat example | head -2 | tail -1 | ${\1//a /the }

ここで変数を作成し、bash文字列操作を使用する必要があります。

middle=$(cat example | head -2 | tail -1)
echo ${middle//a /the }

この例では、多くのツールを使用できることがわかります。

cat example | awk 'gsub(/ a/," the");'

私が実際に見つけようとしているのは、STDOUTを変数にパイプする方法があるかどうかです。

ベストアンサー1

aを2行目に置き換えてパイプラインを続行するにはどうすればよいですか?

sedすべてのas、eventを開始と終了に合わせて最初に変更します。

sed -r -e 's/(^| )a($| )/\1the\2/g'

その後、ライン2でのみ一致するようにします。

sed -r -e '2 s/(^| )a($| )/\1the\2/g'

今あなたはできます

echo -e 'Going to the movies can be fun.
When a dog found a cat a trouble began.
Do not text while driving please.' | sed -r -e '2 s/(^| )a($| )/\1the\2/g' | less

別のソリューション

まず削除cat

catファイルを開いて出力にパイプすると、次のコマンドでパイプされます。入力リダイレクト()を使用すると、シェルがファイルを開き、次の(今は最初の)コマンドの入力に送信することができます<command args <input-fileorで書くことができます<input-file command args。コマンドで.txtファイルをどこに置くかは関係ありません<input-file。パイプを左から右に読み取れるように、リダイレクトを最初に配置しました。

< example head -2 | tail -1 | sed 's/ a / the /g'

代替(まったく同じことをする):

head -2 <example | tail -1 | sed 's/ a / the /g'

以下と同じように動作しますが、プロセスが1つ少なくなります。

cat example | head -2 | tail -1 | sed 's/ a / the /g'

以下はカプセル化です。ここでは、3つのコマンドを括弧で囲み、3つのコマンドすべての出力を別のコマンドにパイプすることができます(ここではlessを使用します)。

{  
  < example head -1
  < example head -2 | tail -1 | sed 's/ a / the /g'
  < example tail -1
} | less

おすすめ記事