У меня есть файл, который содержит следующую информацию:
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 скриптом, который я могу запустить. То, что я хочу сделать:
Так, мой .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 (и компьютер в целом, в этом отношении!)
Вы могли использовать:
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 (я - просто новичок) здесь),
Так как Ваш файл структурирован с пустыми строками между записями, я предложил бы использовать 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