Перепечатка колонки с изменениями - PullRequest
0 голосов
/ 28 февраля 2019

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

lbsrv_standards-d
lbsrv_standards-t
lbsrv_standards

Желаемый вывод:

rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards

Поэтому мне нужно напечатать 1 доллар, пробел, а затем распечатать измененную версию 1 доллар.Я использую awk, но не могу понять подстановку без добавления новой строки между оригиналом и измененными $ 1.

Решение:

awk '{print "rename "$1} ; { gsub("lbsrv", "lb", $1) ; print }'

Вывод:

rename lbsrv_standards-d 
lb_standards-d
rename lbsrv_standards-t 
lb_standards-t
rename lbsrv_standards 
lb_standards

Буду признателен за любую помощь

Спасибо

Ответы [ 6 ]

0 голосов
/ 01 марта 2019

Использование Perl

 perl -pe ' s/lb(?:srv)(.*)/rename $& lb$1/g '

с заданными вами значениями

$ cat jim.txt
lbsrv_standards-d
lbsrv_standards-t
lbsrv_standards

$ perl -pe ' s/lb(?:srv)(.*)/rename $& lb$1/g ' jim.txt
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards

$
0 голосов
/ 01 марта 2019

Это может сработать для вас (GNU sed):

sed 's/lbsrv\(.*\)/rename & lb\1/p;d' file

Использовать сопоставление с образцом для определения частей линии, которые необходимо воспроизвести, и напечатать успешное сопоставление, в противном случае удалите строку.

0 голосов
/ 28 февраля 2019

если создание вывода означает конец для фактического переименования файлов, вы можете вместо этого сделать следующее:

$ rename lbsrv_ lb_ lbsrv_standards{-d,-t,}

будет выполнять переименование префикса для указанных трех файлов (после расширения bash brace).

0 голосов
/ 28 февраля 2019

Остальные ответы хороши, но вы можете видеть, что все, что вам нужно сделать, это использовать printf вместо print:

$ awk '{printf "rename %s ", $1} ; { gsub("lbsrv", "lb", $1) ; print }' file
rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards

Конечно, обычно вы комбинируете командыв одном действии:

$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb", $1) ; print }' file

Кроме того, gsub по умолчанию работает на $0, и модно использовать трейлинг 1 вместо print, так что наконец:

$ awk '{printf "rename %s ", $1; gsub("lbsrv", "lb")}1' file
0 голосов
/ 28 февраля 2019

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

awk 'BEGIN{FS="_"}{print "rename",$0,"lb_"$2}'  Input_file

Объяснение: Добавление пояснения ккод выше.

awk '                           ##Starting awk program from here.
BEGIN{                          ##Starting BEGIN section here.
  FS="_"                        ##Setting field separator as _ here.
}                               ##Closing BEGIN section of awk command here.
{
  print "rename",$0,"lb_"$2     ##Printing string rename then complete line then lb_ string with 2nd column here as per OP need.
}'  Input_file                  ##Mentioning Input_file name here.

2-е решение: Добавление решения sed сейчас.

sed 's/\([^_]*\)_\(.*\)/rename \1_\2 lb_\2/'   Input_file

Вывод будет следующим.

rename lbsrv_standards-d lb_standards-d
rename lbsrv_standards-t lb_standards-t
rename lbsrv_standards lb_standards
0 голосов
/ 28 февраля 2019

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

awk  '{a=$0; sub(/^lbsrv/, "lb", a); print "rename "$0" "a }'

См. онлайн-демонстрацию

Подробнее

  • a=$0- временная переменная уменьшается со значением всей строки
  • sub(/^lbsrv/, "lb", a) - lbsrv в начале строки заменяется на lb
  • print "rename "$0" "a - печатаетсярезультат: rename, пробел, вся строка, пробел и затем содержимое переменной a.

Более простое решение возможно с sed (особенно если строки вводятся индивидуально):

sed 's~^lbsrv\(.*\)~& lb\1~' file > newfile

См. это sed демо

Это команда sed на основе шаблона BRE POSIX, которая находит

  • ^ - начало строки
  • lbsrv - подстрока
  • \(.*\) - Группа 1: любые 0 или более символов до конца строки / ввода.

& lb\1 - это шаблон замены, который сначала занимает всю строку, а затем добавляетпробел lb, а затем содержимое группы 1.

...