我有一个格式如下的文件:
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 -E
或grep -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