[英]How to remove/strip double or single quote from a string?
我有一个包含以下几行的文件:
ENVIRONMENT="myenv"
ENV_DOMAIN='mydomain.net'
LOGIN_KEY=mykey.pem
我想提取=
之后的部分,但没有周围的引号。 我试过这样的gsub
:
awk -F= '!/^(#|$)/ && /^ENVIRONMENT=/ {gsub(/"|'/, "", $2); print $2}'
最终以-bash: syntax error near unexpected token ')'
错误结束。 它适用于单个匹配: /"/
或/'/
但当我尝试匹配任何一个时都不起作用。我做错了什么?
如果您只是想删除标点符号,那么您可以按如下方式进行....
# 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
问题不在于awk
,而在于bash
。 gsub
的单引号关闭了开引号,以便 bash 尝试使用参数解析命令awk
!/^...gsub(/"|/,
, ,
, $2
然后是一个不匹配的关闭括号。尝试替换带'"'"'
单引号(这样 bash 将正确终止字符串,然后应用单引号,然后重新打开另一个字符串。)
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
您可以像这样使用awk
:
awk -F "=['\"]?|['\"]" '{print $2}' file
myenv
mydomain.net
mykey.pem
这将适用于您的awk
awk -F= '!/^(#|$)/ && /^ENVIRONMENT=/ {gsub(/"/,"",$2);gsub(q,"",$2); print $2}' q=\' file
表达式中的单引号引起了问题。 将其添加到变量中,它将起作用。
我做了以下事情:
awk -F"=\"|='|'|\"|=" '{print $2}' file
myenv
mydomain.net
mykey.pem
这告诉awk
使用="
, ='
, '
或"
作为字段分隔符。
这是因为awk
程序在作为命令行程序运行时必须用单引号括起来。 如果脚本中包含单引号,则程序可能会出错。 可以使用特殊技巧在程序中使用单引号作为字符串。 请参阅 GNU Awk 手册中的Shell 引用问题。
一个技巧是将匹配字符串保存为变量:
awk -F\= -v s="'|\"" '{gsub(s, "", $2); print $2}' file
输出:
myenv
mydomain.net
mykey.pem
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.