我想创建一个从命令行获取两个参数的shell脚本,第一个应该是现有文件,另一个是新文件,它将对结果进行内容。从第一个文件开始,我想选择小写单词和然后对它们进行排序并将结果复制到第二个文件中grep命令显然不好,我应该如何更改才能获得结果?
#!/bin/bash
file1=$1
file2=$2
if [ ! -f $file1]
then
echo "this file doesn't exist or is not a file
break
else
grep '/[a-z]*/' $file1 | sort > $file2
答案 0 :(得分:1)
您可以像这样更改grep命令:
grep -o '\<[[:lower:]][[:lower:]]*\>' "$file1" | sort -u > "$file2"
-o是一个输出控制开关,强制grep返回换行符中的每个匹配项。
\<
是左边界,\>
是右边界。 (这样一来,Site
这个词就不会返回ite
)
[[:lower:]][[:lower:]]*
确保至少有一封小写字母
(使用[[:lower:]]
代替范围[a-z]
是首选,因为对于某些区域设置,尽管字符大小写,字母可按字母顺序排列:aBbCcDd...YyZz
) < / p>
注意:我将-u开关添加到sort命令以删除重复的条目,如果您不想要此行为,请将其删除。
答案 1 :(得分:0)
我赶时间,所以我不会重写我在评论中指出的内容,但这是修复所有这些问题的代码:
#!/bin/bash
file1=$1
file2=$2
if [ ! -f $file1 ]
then
echo "this file doesn't exist or is not a file"
else
grep '[a-z]*' $file1 | sort > $file2
fi
ShellCheck再提供一个您应该申请的提示,我会让您查看。
当脚本无法执行其任务时,以非零代码退出也是一个好习惯,就是在没有找到文件的情况下。
答案 2 :(得分:0)
使用awk和sort
,首先是测试文件:
$ cat file
This is a test.
This is another one.
代码:
$ awk -v RS="[ .\n]+" '/^[[:lower:]]+$/' file | sort
a
another
is
is
one
test
我使用space,newline和period作为记录分隔符将每个单词分隔为自己的记录,并打印仅包含小写字母的单词。
答案 3 :(得分:0)
你的shell代码可以使用一些修复。
#!/bin/bash
file1=$1
file2=$2
if [ ! -f "$file1" ] # need space before ]; quote expansions
# send error messages to stderr instead of stdout
# include program and file name in message
printf >&2 '%s: file "%s" does not exist or is not a file\n' "$0" "$file1"
# exit with nonzero code when something goes wrong
exit 1
fi
# -w to get only whole words
# -o to print out each match on a separate line
grep -wo '[a-z][a-z]*' "$file1" | sort > "$file2"
如上所述,如果在文件中多次出现,将包含同一个单词的多个副本;如果您不想要,请更改为sort -u
。