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

时间:2014-08-14 13:50:52

标签: regex bash awk

我有一个包含这些行的文件:

ENVIRONMENT="myenv"
ENV_DOMAIN='mydomain.net'
LOGIN_KEY=mykey.pem

我想在=之后提取部分但没有周围的引号。我尝试使用gsub这样:

awk -F= '!/^(#|$)/ && /^ENVIRONMENT=/ {gsub(/"|'/, "", $2); print $2}' 

最终会出现-bash: syntax error near unexpected token ')'错误。它适用于单个匹配:/"//'/,但当我尝试匹配其中任何一个时,它都不起作用。我做错了什么?

7 个答案:

答案 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,而在于bashgsub中的单引号正在关闭打开的引号,以便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