首页 > 解决方案 > 在特定引用的字符串中交换反斜杠的模式

问题描述

我正在使用 sed(实际上是 ssed 扩展的“-r”,因此我可以访问我可能需要的大多数正则表达式功能)来处理文件,其中一个更改是将双反斜杠字符转换为引号字符串内的单个正斜杠。问题是不应该转换一些包含双反斜杠的引用字符串。我要定位的所有带引号的字符串在引号内都有一个特定的单词“myPhrase”。

因此,对于具有这两行的文件:

"\\\\server\\dir\\myPhrase\\subdir"
"Don't change \\something me!"

输出将是:

"//server/dir/myPhrase/subdir"
"Don't change \\something me!"

我在搜索模式中尝试了各种前瞻组合,例如 (?=myPhrase),它找到所需的引用块并将捕获组 (\\) 替换为 / 作为替换,但我所有的尝试要么只替换第一次出现双反斜杠,或 myPhrase 左侧的反斜杠等。

我确信有一些前瞻/非捕获/递归的组合可以做到这一点,但我现在完全空白。

标签: regexsed

解决方案


试试这个 Perl 解决方案

perl -pe ' s{"(.+)?"}{$x=$1; if($x=~m/myPhrase/ ) {$x=~s!\\\\!/!g};sprintf("\x22%s\x22",$x)}ge ' file

使用以下输入

$ cat ykdvd.txt
"\\\\server\\dir\\myPhrase\\subdir"
"Don't change \\something me!"
Another line

$ perl -pe ' s{"(.+)?"}{$x=$1; if($x=~m/myPhrase/ ) {$x=~s!\\\\!/!g};sprintf("\x22%s\x22",$x)}ge ' ykdvd.txt
"//server/dir/myPhrase/subdir"
"Don't change \\something me!"
Another line

$

推荐阅读