sed / awk + line манипуляция - PullRequest
0 голосов
/ 22 июля 2010

У меня два разных вопроса (по обоим вопросам нужно игнорировать пробелы)

Как напечатать все строки до разделителя "=", например

    echo " bla bla girl man dog = black white color bla 123 4" | sed/awk .....

Напечатает:

    bla bla girl man dog

второй вопрос

Как напечатать все строки от "=" до конца строки

    echo " bla bla girl man dof = black white color bla 123 4" | sed/awk .....

Будет напечатано

    black white color bla 123 4

THX дляпомогите Лидии

Ответы [ 6 ]

1 голос
/ 22 июля 2010

вырезать может помочь вам.cut обрезает линию, используя пользовательский разделитель, и дает вам любые части вокруг нее.

echo " bla bla girl man dof = black white color bla 123 4" | cut -d= -f1 дает вам первую часть перед тем, как =

echo " bla bla girl man dof = black white color bla 123 4" | cut -d= -f2 дает вам вторую часть после=

если у вас более одного = одна строка -f2- даст вам все после первого = (игнорируя второе =).

1 голос
/ 22 июля 2010

Вы можете попробовать это:

echo " bla bla girl man dog = black white color bla 123 4" | awk -F '=' '{print $1}'
0 голосов
/ 20 июня 2014

С Atmark гораздо проще:

первый

@ split = head trim_

второй

@ split = tail trim_
0 голосов
/ 22 июля 2010

С sed:

Первый вопрос:

echo " bla bla girl man dog = black white color bla 123 4" | sed -n '{s/\([^=]*\)=.*/\1/p}'

Второй вопрос:

echo " bla bla girl man dog = black white color bla 123 4" | sed -n '{s/[^=]*=\(.*\)/\1/p}'

С awk:

Первый вопрос:

echo " bla bla girl man dog = black white color bla 123 4" | awk -F= '{print $1}'

Второй вопрос:

, если в каждой строке ровно один =:

echo " bla bla girl man dog = black white color bla 123 4" | awk -F= '{print $2}'

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

echo " bla bla girl man dog = black white color bla 123 4" | cut -d= -f1
0 голосов
/ 22 июля 2010

Для первого используйте

cut -d= -f1

Для второго используйте

cut -d= -f2-

Но эти решения сохраняют пространство.

0 голосов
/ 22 июля 2010

Ответ на первый вопрос:

sed 's/^ *\([^=]*\) *= *\(.*\) *$/\1/'

Ответ на второй вопрос:

sed 's/^ *\([^=]*\) *= *\(.*\) *$/\2/'

Объяснение:

^ *\([^=]*\) *= *\(.*\) *$соответствует всей линии.Он содержит две группы захвата : первая группа захватывает все до первого =, за исключением граничных пространств, вторая группа захватывает все после первого =, за исключением граничных пространств.\1 и \2 являются ссылками на группы захвата.

РЕДАКТИРОВАТЬ Приведенный выше ответ на первый вопрос неверен, так какэто оставляет висячие места.Правильная версия должна выглядеть следующим образом:

sed 's/^ *\([^=]*\) *= *\(.*\) *$/\1/' | sed 's/ *$//'

Кажется, нет способа заставить [^=]* неохотно, поэтому две команды sed.

...