繁体   English   中英

如何从字符串中删除/去除双引号或单引号?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM