Shell-Script
如何在管道命令中使用條件語句?
正在處理的數據將遵循特定的模式。在這種情況下,我想隔離在第三列中找到的所有字元並返回在*“-”*之後找到的所有字元,但前提是該分隔符存在於列中。否則它不應該返回任何東西。
eval $A=$(echo $1 | awk -F"." '{print $3}' | cut -d\- -f2-)
第一條
awk
語句將字元串分成111 222 333-ab3-On21-2
該
cut
命令在第一個“-”之後列印字元。字元串 1
111.2222.333-ab3-On21-2
返回所需的結果:ab3-On21-2
字元串 2
111.2222.334
返回不需要的結果:333
分隔符不存在於字元串的
"-"
最後一部分,在這種情況下如何更改此程式碼以返回 0 或“”?
我不確定您從哪裡獲得“條件”,因為您的語句中沒有任何條件。
awk -F- {print}
沒有做任何有用的事情;只是將輸入傳遞到輸出。但是,您可以使用
sed
表達式做您想做的事情,以簡化整個管道:sed -n 's/.*\.[^-]*-\(.*\)/\1/p'
和意味著它只會列印與表達式匹配的字元串
-n
。p
該表達式將剝離直到最後一個
.
,然後剝離第一個之前的所有內容-
。所以:
% echo 111.2222.333-ab3-On21-2 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p' ab3-On21-2 % echo 111.2222.333 | sed -n 's/.*\.[^-]*-\(.*\)/\1/p' %
如果您的輸入更複雜(例如,可能有四個
.
分隔欄位),那麼模式可能需要更聰明一些。sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p'
例如
% echo 111.2222.333-ab3-On21-2.999 | sed -n 's/.*\.[^-]*-\([^\.]*\).*/\1/p' ab3-On21-2