Регулярное выражение - Sed - PullRequest
1 голос
/ 25 марта 2012

Как бы я заменил запятые после четырех и пятых на |но не те, которые следуют за Один и Два?

\"One,Two, Three\" Four, Five, Six

sed s'/,/|/'g

Буду признателен за ответ, который может быть применен к любым запятым в кавычках, не только в этом примере.

Другой пример:

Mr ,Joe,Lish,,\"Acme, Inc.\",\"9599 Park Avenue, Suite 301\",Manhattan,NY,10022,\"\"\"6 A MAILING LIST MMBR GENERAL\"\"\"

Ответы [ 4 ]

1 голос
/ 25 марта 2012

Это может работать для вас:

 sed 's/^/\n/;:a;s/\n\("[^"]*"\|[^,]\)/\1\n/;ta;s/\n,/|\n/;ta;s/.$//' file

Пояснение:

  • Добавить новую строку к пробелу. s/^/\n/
  • Сделать этикетку :a
  • Перемещение новой строки через строку между кавычками или символ, который не является запятой. s/\n\("[^"]*"\|[^,]\)/\1\n/
  • Если замена была циклом успеха для метки. ta
  • Заменить \n, на |\n. s/\n,/|\n/
  • Если замена была циклом успеха для метки. ta
  • Если замены не выполняются, все сделано, поэтому удалите новую строку. s/.$//

EDIT:

На самом деле вместо \n может использоваться любой уникальный символ или комбинация символов:

echo 'Mr ,Joe,Lish,,\"Acme, Inc.\",\"9599 Park Avenue, Suite 301\",Manhattan,NY,10022,\"\"\"6 A MAILING LIST MMBR GENERAL\"\"\"' | 
sed 's/^/@@@/;:a;s/@@@\("[^"]*"\|[^,]\)/\1@@@/;ta;s/@@@,/|@@@/;ta;s/@@@$//'
Mr |Joe|Lish||\"Acme, Inc.\"|\"9599 Park Avenue, Suite 301\"|Manhattan|NY|10022|\"\"\"6 A MAILING LIST MMBR GENERAL\"\"\"
1 голос
/ 25 марта 2012

В одну сторону, используя sed:

Содержимое script.sed:

## Substitute '\"' with '\n'.
s/\\\"/\n/g

## If there is an odd number of '\"' or the string doesn't end with '\"' I 
## will append some at the end. There is no danger, but it will be used to
## avoid an infinite loop.
## 1.- Save content to 'hold space'.
## 2.- Remove all characters except '\n'.
## 3.- Remove one of them because next command will add another one.
## 4.- Put content in 'pattern space' to begin working with it.
## So, if in original string there were 3 '\"', now there will be 6. ¡Fine!
h
s/[^\n]//g
s/\n//
H
g

## Label 'a'.
:a

## Save content to 'hold space'.
h

## Remove from first '\n' until end of line.
s/\(\n\).*$/\1/

## Substitute all commas with pipes.
s/,/|/g

## Delete first newline.
s/\n//

## Append content to print as final output to 'hold space'.
H

## Recover rest of line from 'hold space'.
g

## Remove content modified just before.
s/[^\n]*//

## Save content to 'hold space'.
h

## Get first content between '\n'.
s/\(\n[^\n]*\n\).*$/\1/
s/\n\{2,\}//

## Susbtitute '\n' with original '\"'.
s/\n/\\"/g

## Append content to print as final output to 'hold space'.
H

## Recover rest of line from 'hold space'.
g

## Remove content printed just before.
s/\n[^\n]*\n//

/^\n/ { 
    s/\n//g
    p   
    b   
}

ba

Содержимое infile:

\"One,Two, Three\" Four, Five, Six 
One \"Two\", Three, Four, Five
One \"Two, Three, Four, Five\"
One \"Two\" Three, Four \"Five, Six\"

Запустите как:

sed -nf script.sed infile

Со следующим результатом:

\"One,Two, Three\" Four| Five| Six
One \"Two\"| Three| Four| Five
One \"Two, Three, Four, Five\"
One \"Two\" Three| Four \"Five, Six\"
0 голосов
/ 25 марта 2012

Я придумал это:

 echo '\"One,Two, Three\" Four, Five, Six' | sed 's/\(\("[^"]*"\)\?[^",]\+\),/\1 |/g'

, который предполагает, что строка похожа на

  [ ["someting"] word, ]* ["someting"] word
0 голосов
/ 25 марта 2012

Для регулярных выражений предусмотрены операторы прогнозирования и прогнозирования.Например, вызов Javascript

bodyText = bodyText.replace (/ Aa (? = A) / g, 'AaB');

заменит текст "Aa "с" AaB ", если за ним следует другое" A ", оставляя вас с" AaBA ".Это не будет соответствовать «AaB», потому что «Aa» не сопровождается другим «A».Это вызов lookahead.

Я полагаю, что синтаксис для lookbehind следующий: <=. </p>

Так что, если эти операторы поддерживаются пакетом, который вы используете, вы можете использовать их длясоответствует «,» с предшествующим «Four» или «Five» и заменяет только «,».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...