【问题标题】:insert '.' between all characters in grep regex and use in piped grep插入 '。'在 grep 正则表达式中的所有字符之间并在管道 grep 中使用
【发布时间】:2015-09-09 23:48:29
【问题描述】:

我想在给定输入字符串的每个字符之间插入'.',然后将其用作管道中的参数

我正在执行以下操作之一:

tail -f file.txt | grep -a 'R.e.s.u.l.t.'
tail -f file.txt | awk '/R.e.s.u.l.t./'

我怎样才能输入'Result' 并将其作为正则表达式参数传递给grep 通过使用额外的bash 默认函数从tail -f 创建的缓冲区接收输入

【问题讨论】:

  • 我有点困惑;所以你想做tail -f file.txt | grep 'Result' 并让它打印出R.e.s.u.l.t. 的结果?
  • 是的,因为我不想在每个字母之间插入点,因为当匹配的单词/句子变长时会有点乏味
  • 为什么要这样做?这似乎是一种奇怪的搜索方式。它与 UTF-16 数据有关吗? -a 选项等价于--binary-files=text-binary-files=TYPE假设二进制文件是 TYPE; TYPE 是 'binary'、'text' 或 'without-match',因此它会在 UTF16 文件中查找 ASCII 字符,而其他字节将为空字节或零字节。

标签: regex replace awk grep pipe


【解决方案1】:
tail -f file.txt | grep -a -e "$(echo Result | sed 's/./&./g')"

这会回显单词 Result 作为 sed 的输入(请考虑 here-string),它将每个字符替换为自身,后跟 .,然后输出是用作grep 的搜索表达式。例如,如果您想用点搜索 -argument-e 可以保护您免受意外伤害。如果字符串在变量中,那么您也可以在其周围使用双引号:

result="Several Words"
tail -f file.txt | grep -a -e "$(echo "$result" | sed 's/./&./g')"

【讨论】:

    【解决方案2】:

    awk 版本:

    tail -f file.txt | 
    awk -v word="Result" '
        BEGIN {gsub(/./, "&.", word); sub(/\.$/, "", word)} 
        $0 ~ word
    '
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多