可以在命令行上运行,但不能在 shell 脚本中运行

可以在命令行上运行,但不能在 shell 脚本中运行

我有一个格式如下的文件:

436541,000454056,Smith,john,jsmith,[email protected]

我想提取“,jsmith”并将其写入另一个文件“test.txt”。

所以我用:

grep -o '\,[a-z][a-z0-9]{1,7}' source.txt > test.txt

从命令行,它工作正常。

当我从 shell 脚本中使用它时,test.txt 文件为空

#!/bin/bash
grep -o '\,[a-z][a-z0-9]{1,7}' source.txt > test.txt

有什么建议么?

答案1

默认情况下,grep使用基本正则表达式(BRE) 不支持{N}.如果它在命令行上工作,您很可能已将grep别名设置为grep -Egrep -P。您可以通过运行来检查

alias | grep grep

脚本中未启用别名。正如中所解释的man bash

Aliases are not expanded when the shell is not interactive, unless  the
expand_aliases  shell option is set using shopt.

因此,在非交互式 shell(运行脚本时所得到的 shell)中,别名不起作用。您有两个选择,要么在脚本中显式启用别名,然后获取文件以获取别名定义(顺便说~/.bashrc一句,无需转义, ):,

#!/bin/bash
shopt -s expand_aliases
source ~/.bashrc
grep -o ',[a-z][a-z0-9]{1,7}' source.txt > test.txt

或者,更简单的是,grep -E在脚本本身中使用:

#!/bin/bash
grep -Eo ',[a-z][a-z0-9]{1,7}' source.txt > test.txt

您可能还想考虑像这样的工具awk不过,它们旨在处理字段分隔的数据。它们很可能会让您的生活变得更加简单。

答案2

如果您的文本文件具有相同的结构,您也可以使用 awk

awk -F"," '{print $5}' INPUTFILE.txt >> test.txt 

还有cut科斯塔斯在评论中提到的

cut -d"," -f5 INPUTFILE.txt >> test.txt 

相关内容