Замените регулярное выражение на строку, содержащую совпадение

У меня есть файл с текстом как

Afghanistan=+93 Albania=+355 Algeria=+213 American Samoa=+1 Andorra=+376 Angola=+244 

В нем есть весь список стран и его код набора.

Я хочу заменить:

Afghanistan=+93 с Afghanistan(+93)=+93

Я могу получить шаблон выбора как =\+[0-9]* , но какая будет строка шаблона замены?

Я знаю, что \1 – это захваченное совпадение для выбора, но, похоже, оно не работает для sed . Поэтому регулярное выражение должно иметь выбор.

Как я могу это сделать с помощью sed или любых других инструментов unix?

4 Solutions collect form web for “Замените регулярное выражение на строку, содержащую совпадение”

 sed 's/=\(+[0-9]\{1,3\}\)/(\1)=\1/' 

Чтобы решить вашу проблему (как я понял):

Шаблоны, которые необходимо запомнить в sed , должны быть заключены в круглые скобки – их внешний вид определяет их номер индекса. Например:

 sed 's/\(<memorized_pattern_1>\)<not_memorized>\(<memorized_pattern_2>\)/\2\1/' 

заменит шаблоны 1 и 2 и удалит средний.

 sed 's/=\([^= ]*\) *$/(\1)&/' <in >out 

Вышеуказанное будет просто заменять последний знак равенства на строке и все символы, которые следуют сначала с …

  1. Копия тех, которые следуют и которые не являются пространством, окруженным двумя паранами (в случае, если на линии есть любые конечные пробелы)

  2. Весь согласованный шаблон снова и снова.

С правой стороны (поле замены s/// ubstitution) \1 представляет первый \( сгруппированный захват \) а & представляет весь согласованный шаблон в виде группы. И так…

 sed 's/=\([^= ]*\) *$/(\1)&/' <<\IN Afghanistan=+93 Albania=+355 Algeria=+213 American Samoa=+1 Andorra=+376 Angola=+244 IN 

  Afghanistan(+93)=+93 Albania(+355)=+355 Algeria(+213)=+213 American Samoa(+1)=+1 Andorra(+376)=+376 Angola(+244)=+244 

Используйте это:

 sed 's/=\(+[0-9]\+\)/(\1)=\1/' file 

Он ищет =+ за которым следует хотя бы одна цифра ( [0-9]\+ ) и заменяет все нужным форматом ( (\1)=\1 ).

Предположим, что все данные находятся в файле с именем file, затем

  awk -F "=" '{print $1"("$2")="$2}' file 
  • Удалите строки между двумя шаблонами, но только если у них есть определенная строка между ними
  • Как я могу удалить поле nth в mth с помощью команды awk?
  • sed + найти значение перед словом в строке
  • Как я могу использовать (sed | awk) для маскирования адреса электронной почты со звездочками типа <j ****** e @ g ***. Com>
  • Оберните первый символ строки, используя sed
  • Извлечь часть значения из пары ключ-значение, разделенной двоеточием в Linux
  • Скрипт сопоставляет буквенный шаблон по нескольким строкам?
  • Удалите текст из файла и сохраните, не открывая
  • Как удалить столбец или несколько столбцов из файла с помощью команды оболочки?
  • Использование sed для обработки файла passwd
  • Как отобразить имя дистрибутива (только) из lsb_release -i
  • Удалите обе строки, если значения столбца A повторяются в следующей строке
  • Linux и Unix - лучшая ОС в мире.