以下一个班轮不能正常工作,我期待:
echo "--tags hi -d -e foo=bar" | perl -ne '$_ =~ s|\b-d\b||; print $_'
" -d"遗迹。看了15分钟后,我觉得我应该得到帮助。
这确实有效:
echo "--tags hi -d -e foo=bar" | perl -ne '$_ =~ s|-d||; print $_'
但当然可能并不总是有效...即我在搜索中需要单词边界标记。
答案 0 :(得分:6)
\b
并不意味着在空格之前或之后,它意味着一个单词边界(一个单词字符序列的转换);由于-
不是单词字符,\b-
表示-
必须在其前面加上单词字符。
我猜你的意思可能是s|(?<!\S)-d(?!\S)||
(-d
既不在前面也不在后面跟着非空白字符。
答案 1 :(得分:2)
与d
不同,-
不是单词char,因此请使用(?<!\w)
代替\b
。
\b
装置
# At a word char that's not preceded by a word char, or
# after a word char that's not followed by a word char.
(?<!\w)(?=\w) | (?<=\w)(?!\w)
所以
\b -d \b
装置
(?: (?<!\w)(?=\w)|(?<=\w)(?!\w) ) -d (?: (?<!\w)(?=\w)|(?<=\w)(?!\w) )
由于-
不是单词char,而且d
是单词char,因此上述内容简化为:
(?<=\w) -d (?!\w)
如果-
是单词char,则上述内容将简化为以下内容:
(?<!\w) -d (?!\w)
这就是你想要的,或者只是
(?<!\w) -d \b
(为了便于阅读,添加了空格。删除空格或使用/x
。)