这是我的原始字符串:
NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1
我只想在冒号前的所有空格添加反斜杠
因此,这就是我最终想要的:
NetworkManager/system\ connections/Wired\ 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1
我需要用bash执行这个操作,所以sed、awk、grep都可以。
我尝试了以下的sed命令,但是它们都无法正常工作。
echo NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1 | sed 's/ .*\(:.*$\)/\\ .*\1/g'
echo NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1 | sed 's/\( \).*\(:.*$\)/\\ \1.*\2/g'
echo NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1 | sed 's/ .*\(:.*$\)/\\ \1/g'
echo NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1 | sed 's/\( \).*\(:.*$\)/\\ \1\2/g'
感谢您回答我的问题。我还是StackOverflow的新手,不知道如何在评论中控制格式。因此,我只编辑了我的原始问题。
我的真实故事是:
当我使用grep或者cscope搜索/etc文件夹下的关键词,例如“address1”,结果看起来会像这样:
./NetworkManager/system connections/Wired 1.nmconnection:14 address1=10.1.10.71/24,10.1.10.1
如果我使用vim编辑器打开光标下的文件,举个例子假设我的vim光标现在在单词“NetworkManager”上, 那么vim会理解为
"./NetworkManager/system"
这就是我想在空格前加"\ "的原因,这样搜索结果会更符合vim编辑器的要求:)
我试过修改cscope的源代码,但是很难完全实现。所以只能进行后处理替换:(
\K
(重置匹配的开始并且丢弃所有先前匹配的字符)和\G
(将位置设置为上一个匹配的结尾或在第一个匹配之前的字符串的开头),例如Perl这样的平台,您可以使用以下正则表达式进行替换:^[^:]*?\K |\G[^:]*?\K
。(每个\K
后面都有一个空格。)演示。将光标悬停在链接中正则表达式的每个元素上以获取其功能的解释。 - Cary Swovelandecho
缺少引号。你对这些字符串做了什么让你认为需要在空格前添加反斜杠? - Ed Mortongrep
和cscope
工具约 30 年的人,我从未遇到过这个问题。我一直使用的是vi
而不是vim
,虽然我从未尝试在vi
中打开文件。根据我们在这里看到的问题,似乎很多人使用vim
来处理更适合使用 shell 的事情! - Ed Morton