用于交换反斜杠(特别是带引号的字符串)的模式

时间:2019-03-28 21:05:08

标签: regex sed

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

对于具有这两行的文件:

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

输出为:

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

我在搜索模式中尝试了多种先行组合,例如(?= myPhrase),该组合查找所需的带引号的块并将捕获组(\\)替换为/,但是我的所有尝试都仅替换了第一次出现双反斜杠或myPhrase左侧的反斜杠,等等。

我确定应该将前瞻性/非捕获性/递归性结合起来使用,但是我现在完全将其清空。

2 个答案:

答案 0 :(得分:0)

使用GNU awk将第三个参数匹配():

$ cat file
"dont change \\this" "\\\\server\\dir\\myPhrase\\subdir" "nor\\this"
"Don't change \\something me!"

$ awk 'match($0,/(.*)("[^"]*myPhrase[^"]*")(.*)/,a){gsub(/[\\][\\]/,"/",a[2]); $0=a[1] a[2] a[3]} 1' file
"dont change \\this" "//server/dir/myPhrase/subdir" "nor\\this"
"Don't change \\something me!"

答案 1 :(得分:0)

尝试此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

$