【问题标题】:Escaping Backslash using awk and gsub使用 awk 和 gsub 转义反斜杠
【发布时间】:2015-02-04 09:33:51
【问题描述】:

在我的项目中,有一个我无法修改的现有函数具有这一行:

gawk -v n=$OCCURENCE "/$OLD/$EXTRA{gsub(\"$OLD\",\"$NEW\")}1" $FILE_TO_AWK

就我而言,对于 $occurence 和 $extra,它给出:

gawk -v n=- "/$OLD/{gsub(\"$OLD\",\"$NEW\")}1" $FILE_TO_AWK

现在这是我正在努力解决的部分, 我尝试用另一种模式替换此模式: ReturnCode=\"200\" ($old) 。 我一直在尝试很多事情,但由于反斜杠和双引号,我一直失败。

如果我有:

[12/12/2014 12/34] 123 /url/test.gsp ReturnCode=\"500\" 12234

我想要这个:

[12/12/2014 12/34] 123 /url/test.gsp 500 12234

我尝试过这样的事情: gawk -v n=- "/ReturnCode=\\\"500\\\"/{gsub(\"ReturnCode=\\\"500\\\"\",\"500\")}1" fichier.txt 它没有工作

使用八进制代码 042 适用于双引号,但不适用于反斜杠...我没有想法,所以如果您能帮助我,我将不胜感激 谢谢!

【问题讨论】:

  • 不确定我是否理解正确,但只是提醒一下:双引号" 和反斜杠是一个特殊的正则表达式字符,所以你需要通过在前面加上反斜杠来转义它们。因此,在您的情况下,模式将是 `\\\\"200\\"\\`
  • 为了澄清,您是在问 $NEW 使用哪个值?
  • 不,$new 不是问题,这是 ReturnCode=\"200\" 作为 $old 即。我知道 \ 和 " 是特殊字符,我确实试图逃脱但没有成功
  • 为了更清楚地说明这一点,您能否提供一个示例输入和所需的输出?另外,这里处理变量的方式有点奇怪,使用-v 将bash 变量“转换”为awk 变量而不用担心转义可能会更好:awk -v old="$OLD" '$0 ~ old'
  • 我无法更改 awk 已完成的 hos。我将提供一个我想要的示例

标签: regex bash shell awk gsub


【解决方案1】:

当事情变得棘手时,我喜欢在我的 AWK 脚本周围使用单引号并将值作为变量 -v OLD="$OLD" -vNEW="$NEW" 传递,然后通过从 AWK 代码中打印出来更容易调试。

但我实际上认为“sed”可能是这项工作的更好工具,使用捕获表达式来保存返回码:

MATCH='url\/test'
OLD='ReturnCode=\\\"\([0-9]*\)\\\"'
NEW='\1'
sed -e "/$MATCH/ { s@$OLD@$NEW@g }" $FILE

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多