【问题标题】:Unable to match a variable using grep because of back slash由于反斜杠,无法使用 grep 匹配变量
【发布时间】:2021-10-14 22:47:22
【问题描述】:

我有一个变量,其值设置为 AMB529\SPB_REPORTING,当我试图找到与其值匹配的值时,由于反斜杠,它不起作用。尝试过双引号和单引号,但没有运气。

下面是例子

var=AMB529\SPB_REPORTING 猫文本.txt | grep "$var"

$var 的值为 AMB529SPB_REPORTING,因此模式匹配不起作用。

提前感谢您的帮助。

【问题讨论】:

  • 使用grep -F 禁用对搜索字符串的解释。
  • 感谢您的回复。我试过了,但没有帮助
  • 那么你的变量首先包含了错误的字符串。将var='AMB529\SPB_REPORTING'grep -F 一起使用。
  • 我在这里测试了它,用单引号定义了一个名为 'f' 的文件,其中包含相同的字符串,正如 Socowi 所说的那样,效果很好。也不需要用grep cat。 var='AMB529\SPB_REPORTING'grep -F "$var" f

标签: bash variables grep pattern-matching


【解决方案1】:

grep 命令可用于显示文件中的行:cat 在这里没用。

缺少;,为了在当前shell中定义var变量(不在cat命令的执行环境中)

将使用包含\ 后跟任何普通字符的正则表达式,就好像\ 字符不存在一样(请参阅man 7 regex)。

@Socowi 是对的,分配给var 的值似乎是文件名(普通字符串)而不是正则表达式。

此外,为 var 赋值时应使用 2 '(引号)以禁止 pathname expansion

试试这个:

var='AMB529\SPB_REPORTING' ; grep -F "${var}" text.txt

使用 bash 内置命令 read 具有相同的行为(请参阅 read --help):\ 后跟普通字符时会被删除。

-r   do not allow backslashes to escape any characters

试试这个:

while IFS= read -r line ; do
   grep -F "${line}" text.txt
   # etc.
done

【讨论】:

  • 也试过了,但没有运气。将屏幕截图粘贴到原始问题中。
  • 您可以尝试使用set -x ; var=AMB529\SPB_REPORTING ; grep -F "${var}" text.txt ; set +x进行调试
  • 还要仔细检查 AMB529\SPB_REPORTING 字符串是否存在于 text.txt 文件中。
  • 好的,让我试试。我已经粘贴了显示输出的屏幕截图 set -x 。似乎变量的值设置不正确。非常感谢。
  • bash 在将值分配给var 之前首先执行pathname expansion:删除\。答案已被修改。
猜你喜欢
  • 1970-01-01
  • 2015-01-06
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多