バッシュにとってはかなり新しい、厳しい一週間について。私は今のところそれが大好きで、長いチェーンパイプが本当に好きです。私が気付いているのは、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を変数として使用する方法があるかどうかです。
まず、sed
をすべてのa
sに一致するように修正し、イベントを開始および終了します。
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
は、ファイルを開いてその出力に渡すだけで、次のコマンドにパイプされます。 input-redirection(<
)を使用して、シェルにファイルを開き、次の(現在は最初の)コマンドの入力に転送させることができます。これはcommand args <input-file
または<input-file command args
と書くことができます。コマンド内のどこに<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つすべての出力を別のコマンドにパイプできます(ここでは使用量を減らしています)。
{
< example head -1
< example head -2 | tail -1 | sed 's/ a / the /g'
< example tail -1
} | less
コマンド置換は($middle
で行うように)進む方法ですが、IMHOはこれらの状況でsed
をパイプするだけの方が簡単です。
そうは言っても、あなたが学んでいることは知っていますが、head
、tail
、およびsed
を組み合わせる必要はほとんどありません。あなたの例は純粋なsed
で次のように表すことができます
sed -n '2s/ a / the /gp' example
-n
はデフォルトで出力を抑制します2
は2行目に一致しますs/ a / the /g
は、a
のすべての( "g" lobal)オカレンスを置き換えます。p
は結果を出力します