在分隔符前删掉一个词 - 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}'
无论发生什么情况,这将始终打印第一个 :
之前的最后一个词
如何使用 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}'
无论发生什么情况,这将始终打印第一个 :
之前的最后一个词