Измените список: отфильтруйте его и перестройте значения в результате

У меня есть файл, который содержит следующую информацию:

Username: Sjohhny@email1.com
Value one: xx:xx:xx:xx:xx:xx
Value two: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Value three: Sjohhny@email1.com@[xx:xx] [a mixuture of the three values]

Username: Vsamba@email3.com
Value one: mm:mm:mm:mm:mm:mm
Value two: mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm
Value three: Vsamba@email3.com@[xx:xx] [a mixuture of the three values]

Username: Skrids@email2.com
Value one: yy:yy:yy:yy:yy:yy
Value two: yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy
Value three: Skrids@email2.com@[xx:xx] [a mixuture of the three values]

Username: Vconan@email4.com
Value one: zz:zz:zz:zz:zz:zz
Value two: zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz
Value three: Vconan@email4.com@[xx:xx] [a mixuture of the three values]

Во-первых, я хочу отфильтровать всю информацию имен пользователей, которые запускаются с S и сохраняют тех, которые запускаются с V. После этого я хочу сделать конечный продукт, который является .sh скриптом, который я могу запустить. То, что я хочу сделать:

  1. Повторите имя пользователя
  2. Удалите третье значение
  3. Выполните команду Hello с переключателями - Один, Два, и - Спасибо - для - посещающий на первых и вторых значениях.

Так, мой .sh файл будет подобен этому

echo Username: Vsamba@email3.com
Hello -One mm:mm:mm:mm:mm:mm -Two: mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm --Thanks -for -visiting

echo Username: Vconan@email4.com
Hello One zz:zz:zz:zz:zz:zz -Two: zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz --Thanks -for -visiting

Я наблюдал целый видео ряд на YouTube относительно Sed, и прочитайте многие статьи, здесь пытаясь придумать сценарий, который приведет к сценарию, который я хотел, но все это отказавшее. Вы могли показать мне, как записать такой сценарий? Я также любил бы его, если Вы рекомендуете websites/refrences, которые читаемы новыми пользователями относительно sed (или Awk или Perl)

Обратите внимание на то, что количество ":" статично для значения один и значения два, это могло бы использоваться так или иначе. Я пытался использовать его, но каждый раз я получил оба значения, когда я попросил только значение один, но Вы знаете, как использовать такой факт намного лучше, чем я.

Извините за долгий вопрос! Просто tooooo требуется много времени, чтобы сделать все это, не автоматизируя процесс, и я нахожусь полностью в мире Linux (и компьютер в целом, в этом отношении!)

3
задан 19 December 2016 в 09:09

2 ответа

Вы могли использовать:

sed -rn '/Username: S/,/^$/d;s/Username/echo &/p;/one: /N;s/Value one: (.+)\n/Hello -One: \1/;s/Value two: (.+)/ -Two \1 --Thanks -for -visiting\n/p' file

Или больше четко

sed -rn '{
        /Username: S/,/^$/d
        s/Username/echo &/p
        /one: /N
        s/Value one: (.+)\n/Hello -One: \1/
        s/Value two: (.+)/ -Two \1 --Thanks -for -visiting\n/p
}' file | tee newfile

Объяснение

  • -r используйте расширенные регулярные выражения, таким образом, мы не должны выходить () или +
  • -n ничего не печатайте, пока мы не просим его (это - то, как мы избавимся от третьей строки),
  • /Username: S/,/^$/d найти Username: S, читайте оттуда до пустой строки и удалите все это
  • s/thing/&/ найти thing и замените его собой
  • /one: /N найти one: и считайте следующую строку также, таким образом, мы можем присоединиться к ним
  • s/Value one: (.+)\n/ соответствие Value one: и независимо от того, что символы прибывают после него до новой строки (\n) который мы должны удалить, чтобы присоединиться к строкам и сохранить неизвестные символы
  • \1 обратная ссылка на шаблон, сохраненный с ()

  • p распечатайте эту строку

(Я изучил некоторые свои sed-fu (я - просто новичок) здесь),

3
ответ дан 1 December 2019 в 13:16

Так как Ваш файл структурирован с пустыми строками между записями, я предложил бы использовать awk или perl в режиме абзаца. Например, использование

  • одна или несколько пустых строк как разделитель записей RS=
  • пространство двоеточия или новая строка как разделители полей -F': |\n'

и затем печатая желаемую информацию, если поле $2 запускается с V:

awk -vRS= -F': |\n' '
  $2 ~ /^V/ {
    print "echo " $1 ": " $2; 
    print "Hello -One " $4, "-Two " $6 " --Thanks -for -visiting"; 
    print "";
  }' file

предоставление

echo Username: Vsamba@email3.com
Hello -One mm:mm:mm:mm:mm:mm -Two mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm:mm --Thanks -for -visiting

echo Username: Vconan@email4.com
Hello -One zz:zz:zz:zz:zz:zz -Two zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz:zz --Thanks -for -visiting
5
ответ дан 1 December 2019 в 13:16

Другие вопросы по тегам:

Похожие вопросы: