web-dev-qa-db-ja.com

パイプSTDOUTを変数として使用していますか?

バッシュにとってはかなり新しい、厳しい一週間について。私は今のところそれが大好きで、長いチェーンパイプが本当に好きです。私が気付いているのは、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を変数として使用する方法があるかどうかです。

3
Proximo

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

まず、sedをすべてのasに一致するように修正し、イベントを開始および終了します。

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
2
ctrl-alt-delor

コマンド置換は($middleで行うように)進む方法ですが、IMHOはこれらの状況でsedをパイプするだけの方が簡単です。

そうは言っても、あなたが学んでいることは知っていますが、headtail、およびsedを組み合わせる必要はほとんどありません。あなたの例は純粋なsedで次のように表すことができます

sed -n '2s/ a / the /gp' example
  • -nはデフォルトで出力を抑制します
  • 2は2行目に一致します
  • s/ a / the /gは、aのすべての( "g" lobal)オカレンスを置き換えます。
  • pは結果を出力します
1
nohillside