Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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文件中使用带有shell扩展的grep和awk,引用了转义问题_Bash_Awk_Grep - Fatal编程技术网

在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'.*.
。不需要
*