1

我有一个包含两个单词的字符串,但有时它可能只包含一个单词,我需要同时获取两个单词,如果第二个单词为空,我想要一个空字符串。我正在使用以下内容:

STRING1=`echo $STRING|cut -d' ' -f1`
STRING2=`echo $STRING|cut -d' ' -f2`

当 STRING 只有一个词时,两个字符串都相等,但我需要第二个屏幕为空。

4

3 回答 3

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 前面的假分隔符)。

于 2013-09-04T17:38:44.493 回答
2

外壳为此具有内置功能。

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
于 2013-09-04T17:53:46.943 回答
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
$
于 2013-09-04T18:00:15.020 回答