在分隔符之前剪切一个单词 - Bash

时间:2015-10-08 07:37:44

标签: bash shell cut

如何使用cut在分隔符之前获取一个单词?例如,我在file.txt中有以下一行:

  一二三四五:六七

当我使用下面的cut命令时:

cat file.txt | cut -d ':' -f1

...然后我在分隔符之前得到了一切;即:

  一二三四五。

...但我只想得到"五"

我不想使用awk或位置,因为文件一直在变化,并且"五"可以在任何地方。唯一固定的是,五个将有一个":"分隔符。

谢谢!

4 个答案:

答案 0 :(得分:2)

由于您需要在这里使用更多的一个字段分隔符,awk来救援:

s='one two three four five: six seven'
awk -F '[: ]' '{print $5}' <<< "$s"
five

编辑:如果您的字段位置可以更改,请尝试awk

awk -F: '{sub(/.*[[:blank:]]/, "", $1); print $1}' <<< "$s"
five

这是一个BASH单行程序,可以在一个命令中得到它:

[[ $s =~ ([^: ]+): ]] && echo "${BASH_REMATCH[1]}"
five

答案 1 :(得分:1)

Pure bash:

s='one two three four five: six seven'
w=${s%%:*}                 # cut off everything from the first colon
l=${w##* }                 # cut off everything until last space
echo $l
# => five

(如果文件中有一个冒号,s=$(grep : file)应设置初始变量)

答案 2 :(得分:0)

你可能想做这样的事情: cat file.txt | while read line do for word in $line do if [ echo $word | grep ':$' ] then; echo $word fi done done

如果它是一致的结构(行中的单词数不同),您可以将第一行更改为:

echo $word | grep ':$'

以避免在分隔符右侧处理':'的方式

答案 3 :(得分:-1)

尝试

PropertyGrid

无论发生什么事情,这将始终在第一个echo "one two three four five: six seven" | awk -F ':' '{print $1}' | awk '{print $NF}'之前打印最后一个单词