我有一个包含两个单词的字符串,但有时它可能只包含一个单词,我需要得到两个单词,如果第二个单词为空,我想要一个空字符串。 我使用以下内容:
STRING1=`echo $STRING|cut -d' ' -f1`
STRING2=`echo $STRING|cut -d' ' -f2`
当STRING只有一个字时,两个字符串相等,但我需要第二个屏幕为空。
答案 0 :(得分:6)
你的问题是(来自cut(1))
`-f FIELD-LIST'
`--fields=FIELD-LIST'
Select for printing only the fields listed in FIELD-LIST. Fields
are separated by a TAB character by default. Also print any line
that contains no delimiter character, unless the
`--only-delimited' (`-s') option is specified.
您可以在提取第二个单词时指定-s,或使用
echo " $STRING" | cut -d' ' -f3
提取第二个单词(注意$ STRING前面的假分隔符)。
答案 1 :(得分:2)
shell具有内置功能。</ p>
echo "First word: ${STRING%% *}"
echo "Last word: ${STRING##* }"
双##或%%与旧shell不兼容;它们只有一个单分隔符变体,它可以修剪最短的匹配而不是最长的匹配。 (您可以通过提取最短的前缀来模拟最长的后缀,然后修剪其他所有内容,但这需要两次修剪。)
助记符:#在键盘上$左边,%在右边。
对于你的实际问题,我会添加一个简单的检查,看看第一次提取是否提取了整个字符串;如果是这样,第二个应该留空。
STRING1="${STRING%% *}"
case $STRING1 in
"$STRING" ) STRING2="" ;;
* ) STRING2="${STRING#$STRING1 }" ;;
esac
顺便说一下,还有这个:
set $STRING
STRING1=$1
STRING2=$2
答案 2 :(得分:1)
为什么不使用read
:
STR='word1 word2'
read string1 string2 <<< "$STR"
echo "$string1"
word1
echo "$string2"
word2
现在缺少第二个字:
STR='word1'
read string1 string2 <<< "$STR"
echo "$string1"
word1
echo "$string2" | cat -vte
$