Bash

使用管道 STDOUT 作為變數?

  • August 13, 2018

對 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匹配所有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只是打開一個文件並將其傳遞給它的輸出,然後通過管道傳遞給下一個命令。我們可以讓 shell 打開一個文件,並通過使用輸入重定向<(我們可以把它寫成command args <input-fileor <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

引用自:https://unix.stackexchange.com/questions/462087