Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写Bash脚本从文本文件中提取每个用逗号分隔的单词_Bash_Shell - Fatal编程技术网

编写Bash脚本从文本文件中提取每个用逗号分隔的单词

编写Bash脚本从文本文件中提取每个用逗号分隔的单词,bash,shell,Bash,Shell,我正在尝试编写一个Bash脚本,该脚本将读取一个文本文件,并在新行中拉出每个后跟逗号的单词。我试着使用grep,但是它打印了整行,其中有一个逗号,我在awk中遇到了同样的问题。我已经检查了manageforgrep,但它似乎更关注标志而不是语法。这是一个普通的.txt文件,不是CSV文件。对于普通的英语语法,只有逗号是合适的。有人能告诉我如何设置这个脚本吗 例如,如果文本文件包含动物列表,如下所示: 兽医诊所治疗下列动物:狗、猫和鸟 脚本将显示: dogs, cats, 看起来您需要了解gre

我正在尝试编写一个Bash脚本,该脚本将读取一个文本文件,并在新行中拉出每个后跟逗号的单词。我试着使用
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更新后显示了潜在的改进。我想对于我们还没有看到的不同输入,这种方法可能会有很多失败的方式。