Bash
使用管道 STDOUT 作為變數?
對 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
假設我想在第二行用“THE”替換每個“A”。這是我目前的做法。
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 作為變數。
如何用第二行的 a 替換,然後繼續管道?
首先修復
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
只是打開一個文件並將其傳遞給它的輸出,然後通過管道傳遞給下一個命令。我們可以讓 shell 打開一個文件,並通過使用輸入重定向<
(我們可以把它寫成command args <input-file
or<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'
這些與以下內容相同,但過程少了一個。
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