Улучшите команду sed для замены первой инстанции символа и всего после символов?

Стать окрашенным выводом от стандартных команд как grep, необходимо установить это alias в Вашем .bashrc

# User specific aliases and functions
alias grep='grep --color=auto'

когда Вы grep что-то в Вашем файле Вы видите что-то вроде этого, (но вероятно в красном):

[root@linuxbox mydir]# grep "\(INFO\|SEVERE\)" /var/log/logname
this entry is an INFO 
SEVERE this entry is a warn!
this entry is an INFO
this entry is an INFO
SEVERE this entry is a warn!

если хотят использовать tail или awk и хочу это, цвет выживает к каналу, затем псевдоним недостаточно, и необходимо использовать --color=always параметр, например:

[root@linubox mydir]# grep --color=always "\(INFO\|SEVERE\)" /var/log/logname | tail -f | awk '{ print $1 }'
this 
SEVERE
this
this
SEVERE

Если Вы хотите цветной текст с awk история немного сложна, но более мощна, например:

[root@linubox mydir]# tail -f /var/log/messages | awk '{if ($5 ~ /INFO/) print "\033[1;32m"$0"\033[0m"; else if ($1 ~ /SEVERE/) print "\033[1;31m"$0"\033[0m"; else print $0}'
this entry is an INFO 
SEVERE this entry is a warn!
this is another ENTRY
this entry is an INFO
this is another ENTRY
this entry is an INFO
SEVERE this entry is a warn!

с каждой строкой в ее собственном цвете.

Существуют многие другой способ получить цветной текст от оболочки с другими инструментами, и они хорошо descripted другими участниками.

1
15.09.2013, 02:26
2 ответа
echo '<e1 name="file1" id="id1" anotherId="id2">' |
  sed -n 's/.*name="\([^"]*\)".*/\1/p'

Или с GNU grep если создано с поддержкой PCRE:

echo '<e1 name="file1" id="id1" anotherId="id2">' |
  grep -Po 'name="\K[^"]*'
2
27.01.2020, 23:21
  • 1
    ; sed пример работает отлично, даже когда атрибуты находятся в другом порядке. –  phatypus 14.09.2013, 14:25

sed

Вы могли упростить его немного с этой версией:

$ echo '<e1 name="file1" id="id1" anotherId="id2">' | \
   sed 's/.*name="\(.*\)" id.*/\1/'

Вы не должны переносить все с parens, только вещи, Вы интересуетесь сохранением для использования позже, таким образом, можно удалить.

grep

Можно также использовать grepспособность использовать механизм регулярного выражения Perl (PCRE):

$ echo '<e1 name="file1" id="id1" anotherId="id2">' | \
   grep -Po '(?<=name=")(\w+)(?=")'

Способность PCRE этого использования смотреть вперед и lookbehind. Нотация ищет последовательность символов такой как "name=" перед тем, что мы ищем. Этот бит делает это:

(?<=name=")

Это затем ищет серию словесных символов, это - то, что мы на самом деле ищем:

(\w+)

Последний бит это делает предвидение, является этим:

(?=")

Это ищет кавычку (") после того, что мы ищем.

awk

$ echo '<e1 name="file1" id="id1" anotherId="id2">' | \
   awk '{gsub("\"","");split($2,a,"="); print a[2]}'

Этот вариант представляет двойные кавычки в виде строки ('"'') выполнение глобальной замены:

gsub("\"","")

Остающаяся строка была бы этим:

<e1 name=file1 id=id1 anotherId=id2>

Таким образом, мы можем позволить awk разделите это, как это обычно было бы и 2-й столбец быть битом, мы интересуемся получением. Это было бы $2 кому: awk. Таким образом, мы могли взять ту переменную и затем разделить ее на знаках "равно" (=).

split($2,a,"=");

Это разделит $2, и сохраните результаты в массиве, a. Послесловия мы можем распечатать 2-й элемент в массиве, при этом этот все на правой стороне знака "равно" от $2.

file1
2
27.01.2020, 23:21
  • 1
    Спасибо за усилие, но ответ @stephane-chazelas работает лучше, когда атрибуты находятся в другом порядке. спасибо –  phatypus 14.09.2013, 14:24
  • 2
    @phatypus - не проблема, показывая другие методы, они могут быть адаптированы в зависимости от Вашей окончательной потребности. –  slm♦ 14.09.2013, 14:40

Теги

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