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

答え2

コマンドの置き換えは(使用するのと同じように)方法ですが、IMHOの$middle場合はパイプする方が簡単です。sed

つまり、あなただけが学んでいることを知っていますが、それを組み合わせることはほとんどhead必要ありません。あなたの例は純粋に次のように表現できます。tailsedsed

sed -n '2s/ a / the /gp' example
  • -n基本的に出力抑制
  • 22行目の一致
  • s/ a / the /g(「g」lobal)のすべての項目を置き換えますa
  • p結果の印刷

関連情報