`sed` заменить и добавить в одну строку - PullRequest
0 голосов
/ 16 января 2020

Я хотел бы заменить точки файла подчеркиванием и добавить исходную строку к замещенной строке с двоеточием.

Так, например, у меня есть

source.uid
source.ip
source.labels
source.name
...

Я хочу в итоге:

source_uid: source.uid
source_ip: source.ip
source_labels: source.labels
source_name: source.name
...

Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 16 января 2020

этот однострочный работает для данного примера:

sed 's/.*/&: &/;s/\./_/' file

Тест:

kent$  cat f
source.uid
source.ip
source.labels
source.name

kent$  sed 's/.*/&: &/;s/\./_/' f
source_uid: source.uid
source_ip: source.ip
source_labels: source.labels
source_name: source.name

альтернативный однострочный awk, который делает то же самое:

awk '{a=$0;gsub(/[.]/,"_",a)}$0=a": "$0' file

update

Если в исходной строке больше точек ("."), То приведенный выше awk-однострочный должен работать. Также эта строка sed:

sed -n 'h;y/./_/;G;s/\n/: /;p' file

Тест со строкой:

kent$  sed -n 'h;y/./_/;G;s/\n/: /;p' <<<"a.b.c.foo.bar" 
a_b_c_foo_bar: a.b.c.foo.bar
1 голос
/ 16 января 2020

РЕДАКТИРОВАТЬ: Чтобы охватить все вхождения, попробуйте следующее.

awk 'BEGIN{OFS=": "}{val=$0;gsub(/\./,"_");print val,$0;val=""}' Input_file

Для предоставленных OP сэмплов вывод будет следующим:

destination.workload.namespace: destination_workload_namespace

Объяснение:

awk '              ##starting awk program from here.
BEGIN{             ##Starting BEGIN section from here.
  OFS=": "         ##setting OFS as colon space here.
}
{
  val=$0           ##creating variable val whose value is current line value.
  gsub(/\./,"_")   ##globally substituting dot with underscore.
  print val,$0     ##printing variable val and edited line here.
  val=""           ##Nullify Val here.
}
' Input_file



Не могли бы вы попробовать следующее.

awk 'BEGIN{FS=".";OFS=": "} {print $1"_"$2,$0}' Input_file


Использование sed: использование возможности хранения sed сопоставил значение регулярного выражения во временном буфере и позже использовал их по мере необходимости.

sed 's/\([^.]*\)\.\(.*\)/\1_\2: \1.\2/' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...