【问题标题】:Linux Check if string exists as separate word (not as substring of another)Linux检查字符串是否作为单独的单词存在(而不是另一个单词的子字符串)
【发布时间】:2015-08-07 04:05:06
【问题描述】:

我有一个包含字符串的文件,我想检查该文件中是否存在一个字符串作为单独的单词。 示例:

字符串 = 内存盒

  • 包含“rambox”的文件:

    initrd=yahya/rambox/initramfs11.cpio.gz rambox ramdisk_size=5242880 ...

“grep”命令会告诉“rambox”存在

  • 文件不包含“rambox”

    initrd=yahya/rambox/initramfs11.cpio.gz ramdisk_size=5242880 ...

“grep”命令将告诉“rambox”存在,因为它作为路径“initrd=yahya/rambox/initramfs11.cpio.gz”的子字符串存在,这是不正确的。 我想获得第二个示例中不存在“rambox”。有什么办法吗?

【问题讨论】:

  • 只需使用grep ' rambox '
  • 没有我的朋友,如果“rambox”在文件的开头或结尾怎么办?!
  • 只是一个提示:grep 支持带有标志的 Perl 正则表达式
  • 试试grep '\<rambox\>'。有多种解决方案,这也可能有效:grep -w rambox.
  • @Survivor :然后grep 用于^ramboxrambox$ 也是如此。您甚至可以将这三个组合成grep -E '(^| )rambox($| )'

标签: linux string bash shell grep


【解决方案1】:

您可以将grep-P 标志一起使用:

grep -P '^rambox | rambox$| rambox '

甚至更好:

grep -P '(^| )rambox($| )'
  • ^ 匹配行首
  • $ 匹配行尾
  • | 是 OR 正则表达式
  • -P, --perl-regexp PATTERN 是 Perl 正则表达式

【讨论】:

  • 感谢第一个更好,如果文件以“ramboxefzegzgq”开头或以“sgsgqsrambox”结尾,则第二个给出错误结果。
  • 然后使用第一个建议。
  • 我现在正在打电话.. 会尽快改善
  • 我会用 [[:space:]] 改变 " " 这也将包括标签,例如
【解决方案2】:

听起来您希望“rambox”被任意数量的空白包围或在行的开头或结尾。 \b 和其他单词边界解决方案(例如,grep -w)在这里不起作用,因为 / 算作非单词。

你可以write your own interpretation of "word boundary",但在这种简单的情况下,它并不值得。

对于这种情况,我可能只是手动处理行首和行尾场景:

$ cat -vet junk
rambox$
 rambox$
rambox $
 rambox$
 foo rambox bar$
 foo  rambox bar$
/rambox/$
ramboxfoo$
ramboxfoo $
 foorambox$
 foorambox $

$ egrep '(^\s*rambox\s+|\s+rambox\s+|\s+rambox\s*$)' junk
 rambox
rambox
 rambox
 foo rambox bar
 foo  rambox bar

【讨论】:

  • 感谢您的建议,但这不起作用,@Maroun 的解决方案有效。
  • 哦?哪个测试用例失败了?
  • 如果行以“ramboxefzegzgq”开头或以“sgsgqsrambox”结尾。
  • 哦,是的。固定的。谢谢!
【解决方案3】:

即使是 Maroun Maroun sims 的答案,我也会通过这个正则表达式 [[:space:]] 更改空间,它将覆盖所有可用空间,例如标签

输入文件

# cat testfile
rambox test test
testrambox test test
test test rambox        with tab
test test rambox
test testrambox
#

输出:

# grep -P '(^|[[:space:]])rambox($|[[:space:]])' testfile
rambox test test
test test rambox        with tab
test test rambox
#

【讨论】:

  • 可读性提示:如果您使用的是-P,请使用\s 而不是[[:space:]]
猜你喜欢
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2014-08-09
  • 2019-06-17
  • 1970-01-01
  • 2017-02-28
  • 2014-01-25
  • 2011-07-16
相关资源
最近更新 更多