在分隔符前删掉一个词 - Bash

Cut one word before delimiter - Bash

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

one two three four five: six seven

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

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

...然后我得到定界符之前的所有内容;即:

one two three four five

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

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

谢谢!

由于您需要在此处使用多个字段分隔符,awk 来拯救:

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

编辑: 如果你的字段位置可以改变,那么试试这个 awk

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

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

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

纯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)应该设置你的初始变量)

你可能想做这样的事情:

cat file.txt | while read line
do
  for word in $line
    do
      if [ `echo $word | grep ':$'` ] then;
        echo $word
      fi
    done
done

如果是一致的结构(每行字数不同),可以把第一行改成:

cat file.txt | cut -d':' -f1 | while read line
do ...

以及避免在分隔符右侧处理“:”的方法

尝试

echo "one two three four five: six seven" | awk -F ':' '{print }' | awk '{print $NF}'

无论发生什么情况,这将始终打印第一个 : 之前的最后一个词