Linux 检查字符串是否作为单独的单词存在(而不是另一个的子字符串)
Linux Check if string exists as separate word (not as substring of another)
我有一个包含字符串的文件,我想检查该文件中是否存在一个字符串作为单独的词。
示例:
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" 在第二个例子中不存在。有办法吗?
您可以将 grep
与 -P
标志一起使用:
grep -P '^rambox | rambox$| rambox '
甚至更好:
grep -P '(^| )rambox($| )'
^
匹配行首
$
匹配行尾
|
是 OR 正则表达式
-P, --perl-regexp
PATTERN 是一个 Perl 正则表达式
听起来您希望 "rambox" 被任意数量的白色包围,space 或者在行的开头或结尾。 \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 Maroun sims 的答案,我也会通过这个正则表达式 [[:space:]] 更改 space,它将涵盖所有免费的 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
#
我有一个包含字符串的文件,我想检查该文件中是否存在一个字符串作为单独的词。 示例:
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" 在第二个例子中不存在。有办法吗?
您可以将 grep
与 -P
标志一起使用:
grep -P '^rambox | rambox$| rambox '
甚至更好:
grep -P '(^| )rambox($| )'
^
匹配行首$
匹配行尾|
是 OR 正则表达式-P, --perl-regexp
PATTERN 是一个 Perl 正则表达式
听起来您希望 "rambox" 被任意数量的白色包围,space 或者在行的开头或结尾。 \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 Maroun sims 的答案,我也会通过这个正则表达式 [[:space:]] 更改 space,它将涵盖所有免费的 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
#