まだ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
すべてのa
s、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-file
orで書くことができます<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
必要ありません。あなたの例は純粋に次のように表現できます。tail
sed
sed
sed -n '2s/ a / the /gp' example
-n
基本的に出力抑制2
2行目の一致s/ a / the /g
(「g」lobal)のすべての項目を置き換えますa
。p
結果の印刷