我有一个带有这些参数及其值的文件
eureka-client
和另一个像这样配置的文件
# parameters.txt
VAR1 001
VAR2 aaa
VAR3 'Hello World'
当我想在函数中获取值时,我使用此命令
# example.conf
VAR1 = 020
VAR2 = kab
VAR3 = ''
第一个参数抛出正确的值,但最后一个只获得'空白空间的问候,我的问题是如何获得整个'Hello World'值?
答案 0 :(得分:0)
如果您可以使用bash
,则无需使用awk
: read
和shell parameter expansion可以合并来解决您的问题 :
while read -r name rest; do
# Drop the '= ' part, if present.
[[ $rest == '= '* ]] && value=${rest:2} || value=$rest
# $value now contains the line's value,
# but *including* any enclosing ' chars, if any.
# Assuming that there are no *embedded* ' chars., you can remove them
# as follows:
value=${value//\'/}
done < parameters.txt
默认情况下, read
也会按空格(例如awk
)将行划分为字段,但与awk
不同,它可以分配余数如果指定了比找到的字段少的变量,则行变为可变,即 last 1;
read
的{{1}}选项通常值得指定,以避免对-r
字符的意外解释。在输入中。
至于您的解决方案尝试:
\
不知道在输入中引用 - 默认情况下,无论引号如何,它都会按空格分隔输入到字段中。
因此,awk
之类的字符串只会分为字段'Hello World'
和'Hello
。
但是,在您的情况下,您可以使用精心设计的FS值将每个输入行拆分为其键和值(FS是输入字段分隔符,也可以通过选项World'
设置;再次命令假设为-F
,这次使用的是bash
,即所谓的process substitution和<(...)
,ANSI C-quoted string}:
$'...'
再次假设值不包含嵌入式 while IFS= read -r value; do
# Work with $value...
done < <(awk -F$'^[[:alnum:]]+ (= )?\'?|\'' '{ print $2 }' parameters.txt)
实例。
字段分隔符正则表达式'
拆分每一行,以便$'^[[:alnum:]]+ (= )?\'?|\''
(第二个字段)包含值,删除封闭的$2
字符(如果有)。
'
是标准实用程序中罕见的例外情况,因为它 理解单引号和双引号字符串(但也不支持嵌入式引号)。
因此,您可以利用xargs
'能力在将参数传递给指定命令时隐式删除封闭引号,默认为xargs
(再次假定为echo
):< / p>
bash
while read -r name rest; do
# Drop the '= ' part, if present.
[[ $rest == '= '* ]] && value=${rest:2} || value=$rest
# $value now contains the line's value, strippe of any enclosing
# single quotes by `xargs`.
done < <(xargs -L1 < parameters.txt)
一次处理一行(xargs -L1
)行(1
),并隐式调用-L
以及每行上找到的所有令牌,并删除任何封闭的引号个人代币。
答案 1 :(得分:-1)
awk中的默认字段分隔符是空格。所以你只打印传递给awk的字符串中的第一个单词。
您可以使用-F [field separator]
在命令行上指定字段分隔符示例,将字段分隔符设置为逗号:
$ echo "Hello World" | awk -F, '{print $1}'
Hello World