Bash 在变量中转义多个点
假设我有一个变量Bash 在变量中转义多个点,bash,Bash,假设我有一个变量$email,它的值是堆栈。over@gmail.com。我想在每个点之前添加一个\,除了最后一个点之外,并将其存储在新变量$email\u soa中 $email\u soa应该是stack\。over@gmail.com在这种情况下。您可以使用gawk: var="stack.over@gmail.com" gawk -F'.' '{OFS="\\.";a=$NF;NF--;print $0"."a}' <<< "$var" 说明: -F'.将字符串按点
$email
,它的值是堆栈。over@gmail.com
。我想在每个点之前添加一个\
,除了最后一个点之外,并将其存储在新变量$email\u soa
中
$email\u soa
应该是stack\。over@gmail.com
在这种情况下。您可以使用gawk
:
var="stack.over@gmail.com"
gawk -F'.' '{OFS="\\.";a=$NF;NF--;print $0"."a}' <<< "$var"
说明:
将字符串按点拆分-F'.
将输出字段分隔符设置为OFS=“\\.”
\.
将最后一个点后的部分保存在变量“a”中a=$NF
是字段数NF
减少字段计数,这将有效地删除最后一个字段。这还告诉NF--
使用awk
。此功能至少可以与GNU的OFS重新组合记录
一起使用gawk
打印重新编译的记录以及一个点和print$0.”a
a
$ var="stack.over@flow.com"
$ echo $var | sed -E 's/\./\\\./g;s/(.*)\\\./\1./'
stack\.over@flow.com
$ var="stack.over@flow.com."
$ echo $var | sed -E 's/\./\\\./g;s/(.*)\\\./\1./'
stack\.over@flow\.com.
注意
\
生成一个文字反斜杠,\.
生成一个文字点您可以使用perl来完成以下操作:
perl -pe 's/\.(?=.*\.)/\\./g' <<<'stack.over@gmail.com'
perl-pe's/\.(?=.*\.)/\\./g'这个怎么样:
temp=${email%.*}
email_soa=${temp/./\\.}.${email##*.}
出于好奇,你为什么要这样做?@JohnKugelman在绑定区文件中有多个点的电子邮件会给出坏名字(检查名称)
替换部分中的
不需要转义。看到一个措辞良好的sed命令总是很高兴的。但是,如果您确实担心可移植性,POSIX 7()中不支持扩展正则表达式的-E
。不过,我相信您在现实世界中不会遇到任何问题。@DrK:如果我真的担心可移植性,那么我会替换-E
,并跳过括号。也来看看-E
在包括Mac在内的大多数Unice上都能正常工作。据我记忆所及,递减NF
并不能保证删除所有awk版本中的最后一个字段。@TomFenech我试过手工atm上的busybox awk
。它也支持它。@TomFenech POSIX没有说任何关于分配给NF
,这意味着你是对的,它不能保证工作。很好。但这不是一个可移植的解决方案,我很好奇,你为什么不认为这是可移植的?这个问题被标记为bash
,那么你的意思是跨bash的不同版本吗?是的,请看一看公平。我想它必须是Bash3.2或更高版本。因此,任何一个在更新方面落后十年多一点的人都可能会遇到问题。
perl -pe 's/\.(?=.*\.)/\\./g' <<<'stack.over@gmail.com'
temp=${email%.*}
email_soa=${temp/./\\.}.${email##*.}