Linux检查字符串是否作为单独的单词存在(而不是另一个单词的子串)

时间:2015-05-25 16:22:38

标签: linux string bash shell grep

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

string = rambox

  • 包含“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”。有办法吗?

3 个答案:

答案 0 :(得分:3)

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

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

甚至更好:

grep -P '(^| )rambox($| )'
  • ^匹配行的开头
  • $匹配行尾
  • |是OR regex
  • -P, --perl-regexp PATTERN是一个Perl正则表达式

答案 1 :(得分:1)

听起来像你想要" 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

答案 2 :(得分:1)

即使是Maroun Maroun的答案也是正确的,我会通过这个regexp [[:space:]]来改变空间,这将覆盖所有可用空间,例如tab

输入文件

# 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
#