Вы можете обобщить, используя форматирование, включенное в строку, чтобы выбрать первое 555
, второе 555
и третье 1212
, не ограничивая себя каким-либо конкретным префиксом в форме замены s/find/replace/
sed
.Затем вы можете ограничить при необходимости, добавив условие сопоставления перед заменой, в которое вы введете 555
или 666
и т. Д.
Чтобы включить сопоставление с шаблоном вместе с заменой, вы используетеследующая форма:
sed '/pattern/s/find/replace/'
Чтобы соответствие шаблону подавляло вывод для всех строк, кроме тех, которые соответствуют шаблону, вы передаете опцию -n
для подавления печати пространства шаблона и включаете p
вконец замещающей формы, чтобы явно напечатать те строки, которые соответствуют, например,
sed -n '/pattern/s/find/replace/p'
Теперь давайте обратимся к вашей проблеме под рукой.Чтобы ограничить переформатированный вывод только теми строками, которые начинаются с (555)
, вы должны сделать:
$ sed -n '/^(555)/s/^(\([^)]*\))\([^-]*\)-\(.*\)$/Area code: (\1) Second: \2- Third: \3/p' file
Area code: (555) Second: 555- Third: 1212
Area code: (555) Second: 555- Third: 1213
Area code: (555) Second: 555- Third: 1214
( примечание: обратные ссылки захватывают только цифры, а не (..)
или '-'
)
Чтобы переформатировать все строки, вы должны удалить -n
и /pattern/
вместе с окончательным p
, используя только базовую форму sed 's/find/replace/
, например,
$ sed 's/^(\([^)]*\))\([^-]*\)-\(.*\)$/Area code: (\1) Second: \2- Third: \3/' file
Area code: (555) Second: 555- Third: 1212
Area code: (555) Second: 555- Third: 1213
Area code: (555) Second: 555- Third: 1214
Area code: (666) Second: 555- Third: 1215
Area code: (777) Second: 555- Third: 1217
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.