【问题标题】:Regex issues in Unix when value assigned to a variable将值分配给变量时,Unix 中的正则表达式问题
【发布时间】:2016-11-12 21:23:34
【问题描述】:

在 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

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

【问题讨论】:

    标签: regex bash unix sed


    【解决方案1】:

    你已经找到了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扩展。

    【讨论】:

      猜你喜欢
      • 2014-07-20
      • 1970-01-01
      • 2010-11-17
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多