Можно ли использовать команду sed для замены: (-> \ (Между тем \ (-> ( - PullRequest
1 голос
/ 25 марта 2020

вопрос описан в его заголовке; любая идея использовать команду sed для замены текста в соответствии с нижеследующими правилами:

  • ( до \(
  • \( до (

если в тексте нет |, я могу сделать 3 sed: 1. ( -> |( 2. \( -> ( 3. |( -> \(

но если мы не можем получить грант, какой символ не появляется в тексте, как архивировать эту задачу?

Ответы [ 2 ]

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

Один из способов, который вы можете попробовать, - сначала заменить \( каким-нибудь невидимым символом, например \x99, затем выполнить подстановку ( и, наконец, изменить \x99 s.

Пример:

kent$  cat f
( ( ( \( \( \(

kent$  sed 's/[\](/\x99/g;s/(/\\(/g;s/\x99/(/g' f
\( \( \( ( ( (
0 голосов
/ 25 марта 2020

Если у вас все в порядке с perl, вы можете использовать ha sh для сохранения сопоставлений и использовать соответствующую часть в качестве ключа в разделе замены

$ echo '(1) \(2\) (3) \(4\)' | 
    perl -pe 'BEGIN{ $h{"("}="\\("; $h{"\\("}="(" } s/\(|\\\(/$h{$&}/g'
\(1) (2\) \(3) (4\)
...