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=$NF
    将最后一个点后的部分保存在变量“a”中
    NF
    是字段数
  • NF--
    减少字段计数,这将有效地删除最后一个字段。这还告诉
    awk
    使用
    OFS重新组合记录
    。此功能至少可以与GNU的
    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##*.}