Я использую sed с регулярным выражением в Linux, но не получаю ожидаемого ответа

#regex #linux #bash #sed

#регулярное выражение #linux #баш #сэд

Вопрос:

У меня есть файл, в котором содержимое выглядит следующим образом

 1234 Name Surname Address
 

и у меня должен быть выходной файл, подобный этому

 (123) Name Surname Address
 

Я использую команду Linux sed

 sed -e 's/^([0-9]{3})./amp;/g' file_name
 

Но моя команда вообще не изменяет входной файл.

Пожалуйста, помогите,

Ответ №1:

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

 $ sed 's/([0-9]{3})[0-9]/(1)/g' file
(123) Name Surname Adress
 

Через GNU sed,

 $ sed -r 's/([0-9]{3})[0-9]/(1)/g' file
(123) Name Surname Adress
 

Объяснение:

 ([0-9]{3})  # Captures first three numbers.
[0-9]       # Matches the last number.
(1)        # In the replacement part, it replaces the four numbers by `(captured group)`
 

Ответ №2:

Вы можете использовать awk

 awk '{$1="("substr($1,1,3)")"}1' file
(123) Name Surname Address
 

Он добавляет круглые скобки к трем первым символам поля #1 и печатает его.
И это короче, чем sed 🙂

Ответ №3:

Вы можете использовать это sed ,

 sed -e 's/^([0-9]{3}).(.*)/(1)2/g' yourfile
 

Объяснение:

  • ^([0-9]{3}) — первые 3 цифры (группа 1)
  • . — сопоставление любого одного символа
  • (.*) — оставшееся содержимое (группа 2)
  • (1) — доступ к первой группе с использованием 1 и добавлением круглых скобок вокруг нее.
  • 2 — доступ ко второй группе

Комментарии:

1. Спасибо, пожалуйста, объясните запись sed, которую вы написали.

2. @MxM, обновил объяснение.

3. Ваша команда sed очень хороша, но то, что я должен сделать, чтобы не переусердствовать с 3-м символом. Например, если у меня есть 0268211456 во входном файле, результатом будет (026) 211456. С уважением,

4. @MxM попробуйте выполнить эту команду sed -r 's/([0-9]{3})([0-9] )/(1)2/g' file

5. @MxM, я не получил what I should do not to overide the 3rd character