在这些情况下,最好将这些行转储到文本文件中,然后“就地”编辑它 x1米15英寸 或重定向 sed ... > out.txt个 在终端(或BASH脚本,...)中:
echo 'Space Sciences - Private Industry - Boeing' | sed -r 's/^((\w+ ){1,2}- (\w+ ){1,2}).*/\1/'
Space Sciences - Private Industry
cat in.txt
Space Sciences - Private Industry - Boeing
sed -r 's/^((\w+ ){1,2}- (\w+ ){1,2}).*/\1/' ~/in.txt > ~/out.txt
cat ~/out.txt
Space Sciences - Private Industry
## Caution: if you forget the > redirect, you'll edit your source.
## Subsequent > redirects also overwrite the output; use >> to append
## subsequent iterations to the output (preserving the previous output).
## To edit "in place" (`-i` argument/flag):
sed -i -r 's/^((\w+ ){1,2}- (\w+ ){1,2}).*/\1/' ~/in.txt
cat in.txt
Space Sciences - Private Industry
5条答案
按热度按时间voase2hg1#
解决此问题的一种方法是确保模式用 escaped 括号括起来:
稍短一点的(而且更 magic-al)是使用
\v
,意思是在它之后的模式中除'0'-'9'
、'a'-'z'
、'A'-'Z'
和'_'
之外的所有ASCII字符都有特殊的含义:请参阅:
:help \(
:help \v
2hh7jdfx2#
如果您不想用反斜杠来转义捕获组(这正是您所遗漏的),那么可以在前面添加
\v
,将Vim的正则表达式引擎转换为 very magic 模式:tzxcd3kk3#
您也可以使用以下较短的模式:
%s
会将样式套用至整个档案。^.
匹配行的第一个字符。&y
在模式后添加y
。pzfprimi4#
您还必须避开Grouping括号:
这招管用。
11dmarpk5#
在
Vim
中,在一个***上选择***,如下或
剖析
Space - Commercial - Boeing
至
Space - Commercial
同样地,
apple - banana - cake - donuts - eggs
被解析为
apple - banana
说明
^
:匹配行首\
-根据第一个正则表达式转义(
、+
、)
(已接受的答案)--或者在前面加上\v
(@ingo-karkat的答案)\w\+
查找单词(\w
将查找第一个 * 字符 *):在本例中,我搜索了一个单词,然后是-
,最后是另一个单词).*
之后,需要撷取群组来寻找/比对/排除其馀文字**附录。**这有点离题,但我认为Vim不太适合执行更复杂的正则表达式/捕获。[我正在做类似于以下内容的事情,这就是我如何找到这个线程的。]
在这些情况下,最好将这些行转储到文本文件中,然后“就地”编辑它
x1米15英寸
或重定向
sed ... > out.txt
个在终端(或BASH脚本,...)中:
sed -r 's/^((\w+ ){1,2}- (\w+ ){1,2}).*/\1/'
个(note
{1,2}
)允许灵活地查找单词的{x,y}
个重复-参见https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html。在这里,由于我的短语是由
-
分隔的,我可以简单地调整这些参数来得到我想要的。