我有一个包含这些行的文件:
ENVIRONMENT="myenv"
ENV_DOMAIN='mydomain.net'
LOGIN_KEY=mykey.pem
我想在=
之后提取部分但没有周围的引号。我尝试使用gsub
这样:
awk -F= '!/^(#|$)/ && /^ENVIRONMENT=/ {gsub(/"|'/, "", $2); print $2}'
最终会出现-bash: syntax error near unexpected token ')'
错误。它适用于单个匹配:/"/
或/'/
,但当我尝试匹配其中任何一个时,它都不起作用。我做错了什么?
答案 0 :(得分:2)
如果您只是想删除标点符号,那么您可以使用如下....
# remove all punctuation
awk -F= '{print $2}' n.dat | tr -d [[:punct:]]
# only remove single and double quotes
awk -F= '{print $2}' n.dat | tr -d \''"\'
tr -d \''" \'是删除任何单引号和双引号。 tr -d [[:punct:]]删除标点符号类中的所有字符
以上第二个命令(不带引号)的示例输出如下
myenv
mydomain.net
mykeypem
答案 1 :(得分:2)
awk
真的需要吗?如果没有,为什么不使用简单的sed
命令:
sed -rn -e "s/^[^#]+='(.*)'$/\1/p" \
-e "s/^[^#]+=\"(.*)\"$/\1/p" \
-e "s/^[^#]+=(.*)/\1/p" data
这似乎过度设计,但它适用于嵌入式引号:
sh$ cat data
ENVIRONMENT="myenv"
ENV_DOMAIN='mydomain.net'
LOGIN_KEY=mykey.pem
PASSWD="good ol'passwd"
sh$ sed -rn -e "s/^[^#]+='(.*)'/\1/p" -e "s/^[^#]+=\"(.*)\"/\1/p" -e "s/^[^#]+=(.*)/\1/p" data
myenv
mydomain.net
mykey.pem
good ol'passwd
答案 2 :(得分:1)
问题不在于awk
,而在于bash
。 gsub
中的单引号正在关闭打开的引号,以便bash尝试使用参数awk
,!/^...gsub(/"|/,
,,
来解析命令$2
,然后一个无与伦比的亲密的paren。尝试用'"'"'
替换单引号(以便bash正确终止字符串,然后应用单引号,然后重新打开另一个字符串。)
答案 3 :(得分:1)
您可以像这样使用awk
:
awk -F "=['\"]?|['\"]" '{print $2}' file
myenv
mydomain.net
mykey.pem
答案 4 :(得分:0)
我做了以下事情:
awk -F"=\"|='|'|\"|=" '{print $2}' file
myenv
mydomain.net
mykey.pem
这告诉awk
使用="
,='
,'
或"
作为字段分隔符。
答案 5 :(得分:0)
这适用于您的awk
awk -F= '!/^(#|$)/ && /^ENVIRONMENT=/ {gsub(/"/,"",$2);gsub(q,"",$2); print $2}' q=\' file
表达式中的单引号会产生问题。将它添加到变量中它将起作用。
答案 6 :(得分:0)
这是因为当作为命令行程序运行时,awk
程序必须用单引号括起来。如果脚本中包含单引号,则可以触发该程序。可以使用单引号作为程序内部的字符串。请参阅GNU Awk手册中的Shell-Quoting Issues。
一个技巧是将匹配字符串保存为变量:
awk -F\= -v s="'|\"" '{gsub(s, "", $2); print $2}' file
输出:
myenv
mydomain.net
mykey.pem