2016-07-30 17 views
2

我有一些文本是我用管道創建的,我想進一步操作使用echo而不是awk。當你將東西變成回聲或打印時,什麼參數調用STDIN?

說我:

a chain | of | commands | producing |stream | of text 

產量:

line 1 text 
line 2 text 
line 3 text 

但是,如果我想使用echo做這樣的事情:

a chain | of | commands | producing |stream | of text | echo ${STDIN%text} 

切斷所有文字之後它說線,我將如何參考,以得到這個預期的結果:

line 1 
line 2 
line 3 
+4

'echo'在這裏根本就不是正確的工具。任何使用'echo'的解決方案都會很複雜且不自然。 sed或awk是最好的。 –

回答

3

如awk的工具是最適合您的方案:

a chain | of | commands | awk '{sub(/[[:blank:]]*text$/,"")}1' 

sub通過在整個記錄$0默認行爲,並保留空格/製表符的檢索的文本數量。


需要更多的AWK?檢查[ this ]

+0

@JohnKugelman:Thankyou,已更新 – sjsam

+1

此外,如果管道產生太多輸出,那麼將管道輸出放入bash數組的任何東西都會崩潰。 –

+0

@StephenC:我明白,爲什麼我會提供一個awk解決方案.. :) – sjsam

4

雖然這將方便適用parameter expansions${var%text}標準輸入輸入,外殼不支持 - 顧名思義,參數擴展僅限於參數(變量)

雖然你可能你的命令到while IFS= read -r line ...循環和${line}執行循環體的擴張,這樣的做法是緩慢(和冗長的)。

因此,外部工具是這裏的最佳選擇,如sed

cat <<<$'line 1 text\nline 2 text\nline 3 text' | sed 's/text$//' 

以上sed命令貴參數擴展會做什麼。
如果您還想修剪「文字」前的空格:sed 's/ text$//'
要修剪可變數量的空間,包括無:sed 's/ *text$//'
要修剪的可變數目的空格,但至少1:sed 's/ \{1,\}text$//'

  • (基本)的正則表達式text$,在結尾的任何線匹配($text

  • s/...//然後用空白字符串替換匹配的部分(空字符串),有效地刪除text後綴。


sjsam's helpful answer示出了基於awk替代。

+0

awk答案我猜是最有意義的。謝謝 – Tom

+0

@Tom:'sed'解決方案同樣可以工作(並且稍微更簡潔),性能也會類似,所以在這種特殊情況下,任何解決方案都可以。一般來說,'sed'強大的套裝是基於正則表達式的轉換(就像在這種情況下),而'awk'則擅長基於現場的處理。 – mklement0

相關問題