当赋值给变量时,Unix中的正则表达式问题

时间:2016-07-11 02:25:34

标签: regex bash unix sed

在Unix中将输出重定向到变量时出现问题。

mobileTest.txt

abc.xyx.homepage:https://www.abc.xyz/h-offer/?fromms=1&LNX=KJHYU&oC=ABC

脚本:

#!/bin/bash
TEST_PAGE_KEY="abc.xyx.homepage"

grep -w $TEST_PAGE_KEY  mobileTest.txt | cut -d':'  -f2-|sed 's/[&/\]/\\&/g'

输出:这是正确的......

https:\/\/www.abc.xyz\/h-offer\/?fromms=1\&LNX=KJHYU\&oC=ABC

相反,在变量中捕获命令的输出时:

TEST_PAGE_VALUE=`grep -w $TEST_PAGE_KEY  mobileTest.txt | cut -d':'  -f2-|sed 's/[&/\]/\\&/g'`

echo $TEST_PAGE_VALUE

变量输出:

https:&&www.abc.xyz&h-offer&?fromms=1&LNX=KJHYU&oC=ABC

当我将其分配给变量时,我不明白为什么输出不同(而不是添加反斜杠,它会将字符替换为&)。

1 个答案:

答案 0 :(得分:3)

您已找到其中一个原因why the modern $(...) command-substitution syntax is preferable to legacy syntax `...`

使用$(...),您无需担心\个字符。在您的命令中,在命令替换的上下文中具有特殊含义。

因此,使用$(...)而非`...`将产生所需的结果

test_page_value=$(grep -w "$TEST_PAGE_KEY"  mobileTest.txt | cut -d':'  -f2-|sed 's/[&/\]/\\&/g')

还要注意我是如何为avoid conflicts with environment variables and special shell variables避免使用全大写变量名,以及为了保护我是如何双引号(仍然命名不佳)$TEST_PAGE_KEY来自潜在的shell扩展。