Предположим, у меня есть строка 'abbc', и я хочу заменить:
- ab -> bc
- bc -> ab
Если я попробую две замены, результат будет не тем, что я хочу:
echo 'abbc' | sed 's/ab/bc/g;s/bc/ab/g'
abab
Так какую команду sed я могу использовать для замены, как показано ниже?
echo abbc | sed SED_COMMAND
bcab
РЕДАКТИРОВАТЬ : На самом деле текст может иметь более 2 шаблонов, и я не знаю, сколько замен мне понадобится. Поскольку был ответ о том, что sed
это потоковый редактор и его замены жадно, я думаю, что для этого мне понадобится некоторый язык сценариев.
g
флаг из обеихs///
команд, и это сработает.ab
илиbc
в исходном вводе.Ответы:
Может быть, что-то вроде этого:
Замените
~
на символ, которого вы знаете, не будет в строке.источник
\x0
для~~
.g
необходимым и что он делает?g
для global - он заменяет все экземпляры шаблона в каждой строке, а не только первый (это поведение по умолчанию).Я всегда использую несколько утверждений с "-e"
$ sed -e 's:AND:\n&:g' -e 's:GROUP BY:\n&:g' -e 's:UNION:\n&:g' -e 's:FROM:\n&:g' file > readable.sql
Это добавит '\ n' перед всеми AND, GROUP BY, UNION и FROM, тогда как '&' означает совпавшую строку, а '\ n &' означает, что вы хотите заменить совпавшую строку на '\ n' перед 'совпавшим '
источник
Вот вариант ответа ooga, который работает для нескольких пар поиска и замены без необходимости проверять, как значения могут быть повторно использованы:
Вот пример:
перед:
после:
Обратите внимание, что
\b
обозначает границы слов, что мешает________
поиску (я использую GNU sed 4.2.2 в Ubuntu). Если вы не используете поиск по границе слов, то этот метод может не работать.Также обратите внимание, что это дает те же результаты, что и удаление
s/________//g
и добавление&& sed -i 's/________//g' path_to_your_files/*.txt
в конец команды, но не требует указания пути дважды.Общее изменение на это было бы использовать
\x0
или_\x0_
в месте ,________
если вы знаете , что не обнуляет не появляются в файлах, а jthill предложил .источник
sed 's/ab/xy/' | sed 's/cd/ab/' .....
)sed
потоковый редактор Он ищет и жадно заменяет. Единственный способ сделать то, что вы просили, это использовать промежуточный шаблон замещения и в конце изменить его.echo 'abcd' | sed -e 's/ab/xy/;s/cd/ab/;s/xy/cd/'
источник
Это может работать для вас (GNU sed):
При этом используется справочная таблица, которая подготавливается и хранится в удерживающем пространстве (HS), а затем добавляется к каждой строке. Уникальный маркер (в данном случае
\n
) добавляется к началу строки и используется в качестве метода увеличения поиска по всей длине строки. Как только маркер достигает конца строки, процесс завершается и распечатывается таблица поиска и маркеры отбрасываются.NB. Таблица поиска подготавливается в самом начале, и
:
выбирается второй уникальный маркер (в данном случае ), чтобы не конфликтовать со строками подстановки.С некоторыми комментариями:
Таблица работает так:
источник
Может быть более простым подходом для вхождения одного шаблона, вы можете попробовать, как показано ниже: echo 'abbc' | sed 's / ab / bc /; s / bc / ab / 2'
Мой вывод:
Для нескольких вхождений шаблона:
пример
Надеюсь это поможет !!
источник
Tcl имеет встроенный для этого
Это работает, проходя строку символ за раз, делая сравнение строк, начиная с текущей позиции.
В perl:
источник
Вот
awk
основанный на oogassed
источник