Шаблон для замены обратной косой черты в определенных цитируемых строках - PullRequest
0 голосов
/ 29 марта 2019

Я использую sed (на самом деле ssed с расширенной "-r", поэтому у меня есть доступ к большинству любых функций регулярных выражений, которые могут мне понадобиться) для обработки файлов, одно изменение заключается в преобразовании двойных символов обратной косой черты в одну прямую косую черту внутри кавычек строки. Проблема в том, что некоторые строки в кавычках, содержащие двойные обратные слеши, не должны быть преобразованы. У всех строк в кавычках, на которые я хочу ориентироваться, есть определенное слово «myPhrase» внутри кавычек.

Итак, для файла с этими двумя строками:

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

вывод будет:

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

Я пробовал различные комбинации вида вида (? = MyPhrase) в шаблоне поиска, который находит нужные куски в кавычках и заменяет группу захвата (\\) на / в качестве замены, но все мои попытки либо заменяют только первое появление двойных обратных косых черт или тех, что слева от myPhrase и т. д.

Я уверен, что есть какая-то комбинация lookahead / noncapture / recursion, которая должна сделать это, но сейчас я полностью отключаюсь.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Попробуйте это решение 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

$
0 голосов
/ 29 марта 2019

С GNU awk для соответствия 3-го аргумента ():

$ 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!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...