在bash文件中使用带有shell扩展的grep和awk,引用了转义问题
以下命令在命令行中工作:在bash文件中使用带有shell扩展的grep和awk,引用了转义问题,bash,awk,grep,Bash,Awk,Grep,以下命令在命令行中工作: $ grep ".*" /some/long/path/*-version --exclude=X-version | awk -F ":" '/1/ {print $2}' 1.0.0 但是,在尝试从bash脚本执行相同操作时,我遇到了问题。我很确定这是因为我没有正确地避开一些引语。我尝试了几种不同的组合,这是我目前的尝试: DIR="/some/long/path" VERSION=$(grep ".*" "${DIR}/*-version" --exclude
$ grep ".*" /some/long/path/*-version --exclude=X-version | awk -F ":" '/1/ {print $2}'
1.0.0
但是,在尝试从bash脚本执行相同操作时,我遇到了问题。我很确定这是因为我没有正确地避开一些引语。我尝试了几种不同的组合,这是我目前的尝试:
DIR="/some/long/path"
VERSION=$(grep ".*" "${DIR}/*-version" --exclude=X-version | awk -F ":" '/1/ {print $2}')
在执行此输出时
grep: /some/long/path/*-version: No such file or directory
你的想法似乎是对的,但是有几个不必要的例子,你在逃避引用
VERSION=$(grep ".*" "${DIR}"/*-version\" --exclude=X-version | awk -F \":\" '/1/ {print $2}')
# ^^^ ^^^^^^
您不需要在grep
中引用glob字符串,只需按如下方式编写即可。这些引号防止您的shell glob扩展发生。与您为grep
定义的正则表达式(需要按字面意思保留)不同,glob扩展需要/将在实际命令执行之前发生
grep ".*" "${DIR}"/*-version
-F
周围的引号也不是必需的。awk
的-F
参数接受正则表达式,因此除非反限制符是shell元字符,否则不需要引用反限制符。所以-F:“
或者仅仅-F:
就足够了
awk -F ":" '/1/ {print $2}'
此外,您不需要同时使用grep
/awk
来解决单个问题Awk
本身就是一把瑞士ArmyTM刀,它的功能远远超过了grep
的功能
从你的要求来看,我认为你所需要的是
awk 'FILENAME == "X-version" { next } /[.].*1/' /some/long/path/*-version
正则表达式
[.].*1
将文字点
字符与任何字符的贪婪匹配匹配,并随后包含1
。您的想法似乎是正确的,但也有一些不必要的情况,您正在转义引号
VERSION=$(grep ".*" "${DIR}"/*-version\" --exclude=X-version | awk -F \":\" '/1/ {print $2}')
# ^^^ ^^^^^^
您不需要在grep
中引用glob字符串,只需按如下方式编写即可。这些引号防止您的shell glob扩展发生。与您为grep
定义的正则表达式(需要按字面意思保留)不同,glob扩展需要/将在实际命令执行之前发生
grep ".*" "${DIR}"/*-version
-F
周围的引号也不是必需的。awk
的-F
参数接受正则表达式,因此除非反限制符是shell元字符,否则不需要引用反限制符。所以-F:“
或者仅仅-F:
就足够了
awk -F ":" '/1/ {print $2}'
此外,您不需要同时使用grep
/awk
来解决单个问题Awk
本身就是一把瑞士ArmyTM刀,它的功能远远超过了grep
的功能
从你的要求来看,我认为你所需要的是
awk 'FILENAME == "X-version" { next } /[.].*1/' /some/long/path/*-version
正则表达式
[.].*1
将文本点
字符与任何字符的贪婪匹配匹配,并随后包含1
。尝试将“${DIR}/*-version”
替换为“${DIR}”/*-version
显示您的版本文件的外观。您不需要在这里使用grep+awk,只需awk
就可以了good@Inian我使用grep是因为我需要排除一个文件,我没有找到一种方法来使用awk
alone@DeepSpace:您可以在awk
中执行此操作。提供版本
文件的示例片段和要排除的文件名您根本不需要grep(awk
有一个文件名变量,您可以检查),但是如果您确实需要grep
,您可以使用grep'.
而不是grep'.*.
。无需使用*
尝试将“${DIR}/*-version”
替换为“${DIR}”/*-version
显示您的版本文件的外观。您不需要在这里使用grep+awk,只需awk
就可以了good@Inian我使用grep是因为我需要排除一个文件,我没有找到一种方法来使用awk
alone@DeepSpace:您可以在awk
中执行此操作。提供版本
文件的示例片段和要排除的文件名您根本不需要grep(awk
有一个文件名变量,您可以检查),但是如果您确实需要grep
,您可以使用grep'.
而不是grep'.*.
。不需要*