2014-03-24 104 views
0

我得到以下輸出並且想要測試其行數(例如wc -l)是否等於2。如果是這樣,我想追加一些內容。它只能使用鏈式管道。bash:如果輸入字符串有2行,追加新行/字符串/文本

開始輸入:

echo "This is a 
new line Test" 

目標輸出:

"This is a 
new line Test 
some chars" 

但是,只有當開始輸入線數等於2

我已經嘗試過這樣的:

echo "This is a 
new line Test" | while read line ; do lines=$(echo "$lines\n$line") ; echo $all ... ; done 

但沒有這些想法得到了解決方案。 使用sed/awk等是好的,只有它應該是一個鏈式管道。

謝謝!

+0

這是什麼意思爲「僅使用鏈式管道」或「是鏈式管道」?這種限制的原因是什麼? – ruakh

+0

需要是一個單行.. – user1159208

回答

3
awk '1; END {if (NR <= 2) print "another line"}' file 

這裏的另一種方式只是爲了好玩:bash的版本4

mapfile lines <file; (IFS=; echo "${lines[*]}"); ((${#lines[@]} <= 2)) && echo another line 

更好的bash:三通成進程替換

$ seq 3 | tee >((($(wc -l) <= 2)) && echo another line) 
1 
2 
3 

$ seq 2 | tee >((($(wc -l) <= 2)) && echo another line) 
1 
2 
another line 

$ seq 1 | tee >((($(wc -l) <= 2)) && echo another line) 
1 
another line 
+0

就是這樣!謝謝!:)) – user1159208

+0

我很好奇爲什麼'IFS = ;'是的,爲了與這個問題保持一致,'<= 2'應該是'== 2' – mklement0

+0

沒有「-t」的mapfile會在數組中留下換行符,所以我想要顯式地加入這些行標題說<2,問題說== 2,所以我認爲...... –

0

用awk它是非常簡單的:

[[ $(wc -l < file) -eq 2 ]] && awk 'NR==2{$0=$0 RS "some chars"} 1' file 
This is a 
new line Test 
some chars 
+0

但是,這也將插入「一些字符,如果有超過2行輸入... :(但謝謝!比我的嘗試.. – user1159208

+0

好吧,看到更新的答案。 – anubhava

+0

一般是的,但我不能這樣做:echo「...」| [[$(wc -l <​​input)]] – user1159208

0

這隻會產生(增加)輸出,以防輸入線數爲2:

echo "This is a 
new line Test" | 
    awk \ 
    'NR>2 {exit} {l=l $0 "\n"} END {if (NR==2) printf "%s%s\n", l, "some chars"}'