编写Bash脚本从文本文件中提取每个用逗号分隔的单词
我正在尝试编写一个Bash脚本,该脚本将读取一个文本文件,并在新行中拉出每个后跟逗号的单词。我试着使用编写Bash脚本从文本文件中提取每个用逗号分隔的单词,bash,shell,Bash,Shell,我正在尝试编写一个Bash脚本,该脚本将读取一个文本文件,并在新行中拉出每个后跟逗号的单词。我试着使用grep,但是它打印了整行,其中有一个逗号,我在awk中遇到了同样的问题。我已经检查了manageforgrep,但它似乎更关注标志而不是语法。这是一个普通的.txt文件,不是CSV文件。对于普通的英语语法,只有逗号是合适的。有人能告诉我如何设置这个脚本吗 例如,如果文本文件包含动物列表,如下所示: 兽医诊所治疗下列动物:狗、猫和鸟 脚本将显示: dogs, cats, 看起来您需要了解gre
grep
,但是它打印了整行,其中有一个逗号,我在awk
中遇到了同样的问题。我已经检查了manageforgrep,但它似乎更关注标志而不是语法。这是一个普通的.txt文件,不是CSV文件。对于普通的英语语法,只有逗号是合适的。有人能告诉我如何设置这个脚本吗
例如,如果文本文件包含动物列表,如下所示:
兽医诊所治疗下列动物:狗、猫和鸟
脚本将显示:
dogs,
cats,
看起来您需要了解
grep
的-o
参数(仅匹配)。如果你认为一个单词是由空间分隔的一系列字母,那么这个匹配就可以做到:
grep -o "[a-zA-Z]\+," file
看起来您需要了解
grep
的-o
参数(仅匹配)。如果你认为一个单词是由空间分隔的一系列字母,那么这个匹配就可以做到:
grep -o "[a-zA-Z]\+," file
如果您的grep版本支持
-o
开关,那么您可以使用该开关,否则在大多数awk版本中都可以使用:
awk '{ for (i = 1; i <= NF; ++i) if ($i ~ /^[[:alpha:]]+,$/) print $i }' file
如果您的grep版本支持
-o
开关,那么您可以使用该开关,否则在大多数awk版本中都可以使用:
awk '{ for (i = 1; i <= NF; ++i) if ($i ~ /^[[:alpha:]]+,$/) print $i }' file
还有一个带有
sed
:
#! /bin/sh
sed '
s/[^,]* //g
s/,[^,]*$/,/
s/,\(.\)/,\
\1/g
' <<EOF
The Veterinary clinic treats the following animals: dogs, cats, and birds
EOF
#/垃圾箱/垃圾箱
塞德
s/[^,]*//g
s/,[^,]*$//
s/,\(.\)/\
\1/g
“还有一个带有sed
:
#! /bin/sh
sed '
s/[^,]* //g
s/,[^,]*$/,/
s/,\(.\)/,\
\1/g
' <<EOF
The Veterinary clinic treats the following animals: dogs, cats, and birds
EOF
#/垃圾箱/垃圾箱
塞德
s/[^,]*//g
s/,[^,]*$//
s/,\(.\)/\
\1/g
“你试过什么?(为什么有人对一个显然没有任何代码的问题投了更高的票?)我所做的一切都没有接近我想要的,grep-o',
,然后grep-o'[:alpha:][],
,我不明白awk
除了转动轮子之外还能做什么。谢谢你的帮助,戈蒂。我不确定哪一个是正确的,因为我还不太了解bash脚本和相应的命令,不知道为什么其他两个不起作用。你试过什么?(为什么有人对一个显然没有任何代码的问题投了更高的票?)我所做的一切都没有接近我想要的,grep-o',
,然后grep-o'[:alpha:][],
,我不明白awk
除了转动轮子之外还能做什么。谢谢你的帮助,戈蒂。我不确定哪一个是正确的,因为我还不太了解bash脚本和相应的命令,不知道为什么其他两个不起作用。不,这将在每一行输入中首次出现这种模式,而不是OP要求的“所有匹配”。您需要拆分输入,以便单个单词位于单独的行上,例如,在文本到达grep-o
@ghoti之前,通过管道传输tr'[[:space:][]'\n'
。@ghoti当我使用OP的示例在Mac上测试它时,这个答案非常有效。也就是说,它打印所有匹配项,而不仅仅是第一次出现。你能找到一个反例吗?不,这将在每一行输入中提取出该模式的第一个匹配项,而不是OP要求的“所有匹配项”。您需要拆分输入,以便单个单词位于单独的行上,例如,在文本到达grep-o
@ghoti之前,通过管道传输tr'[[:space:][]'\n'
。@ghoti当我使用OP的示例在Mac上测试它时,这个答案非常有效。也就是说,它打印所有匹配项,而不仅仅是第一次出现。你能找到一个反例吗?问题提到“逗号适用于普通英语语法”。在英语中,一个句子中可能会出现一个新行,这并非不可想象的:狗、猫和鸟。
设置一个记录分隔符,只保留一个空格,将错误地匹配这些新行,并且以奇怪和不一致的方式。(试试看,很有趣。)@ghoti更新后显示了潜在的改进。我想对于我们还没有看到的不同输入,这种方法可能有很多失败的地方。问题提到“逗号适用于正常英语语法”。在英语中,一个句子中可能会出现一个新行,这并非不可想象的:狗、猫和鸟。
设置一个记录分隔符,只保留一个空格,将错误地匹配这些新行,并且以奇怪和不一致的方式。(试试看,很有趣。)@ghoti更新后显示了潜在的改进。我想对于我们还没有看到的不同输入,这种方法可能会有很多失败的方式。