2016-11-08 95 views
0

我正在使用下面的命令根據分隔符剪切字符串。但我希望輸出與分隔符一起打印。Unix:與分隔符一起剪切字符串

樣品字符串: test_file.txt

命令:

echo "test_file.txt" | cut -sd_ -f1 

電流輸出:測試

預期輸出:TEST_

編輯:我使用剪切 - 如果字符串不包含分隔符,sd將報告null。所以如果分隔符不存在,我應該輸出爲null。

回答

2

如果你正在使用bash那麼就不需要外部工具:

s='test_file.txt' 
[[ $s == *_* ]] && echo "${s%%_*}"_ 

test_ 

或者使用sed

sed -n 's/_.*/_/p' <<< "$s" 

test_ 

或者使用awk

awk -F_ 'NF>1{print $1 FS}' <<< "$s" 

test_ 
+0

謝謝你的快速解決方案..我在cut命令中使用了sd,所以如果沒有分隔符,它會報告null。這是否也可以通過上述命令完成?對於例如如果我使用testfile.txt,我應該得到輸出爲空作爲分隔符不存在 –

+0

是的,我編輯的答案中的所有選項都會照顧到這一點。 – anubhava

+1

非常感謝:)乾杯 –

0

你不能用cut做到這一點,但你可以sed做到這一點:

$ echo "test_file.txt" | sed 's/\([^_]*_\).*$/\1/' 
test_ 

如果你想什麼都沒有,如果沒有_,最簡單的方法可能是雜草要打印出單獨的線,

$ echo "test_file.txt" | sed '/^[^_]*$/d; s/\([^_]*_\).*$/\1/' 
+0

感謝您的快速解決方案..我在cut命令中使用了sd,因此如果沒有分隔符存在,它會報告null。這可以通過sed來完成嗎?對於例如如果我使用testfile.txt,我應該得到輸出爲空作爲分隔符不存在。 –

+0

我原來的命令會讓不包含'_'的行保持不變;我添加了另一個按您的要求行事的選項。 – zwol

+0

非常感謝你:) –

0
echo "test_file.txt" |grep -oP '^.*?_' 
test_ 

這將打印從線直到第一分隔符(_),包括分隔符的開始什麼。

+0

非常感謝你:) –