#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