Помогите создать это выражение с помощью sed

У меня есть текстовый файл, и я должен избавиться от всей информации незадолго до = символ в каждой строке, например:

Строка:

File 1515 = foo.txt

потребности быть похожими на это:

=foo.txt

Так, у меня было это использование строки sed:

sed s/=[^=]*^// everyone.pls

но это удаляет все символы после = символ.

Так, мой вопрос: как я могу удалить символы прежде =?

Не забывайте, что я не хочу удалять = символ, мне нужно незадолго до него.

2
задан 25 March 2014 в 10:18

6 ответов

Удалить все перед первый знак "равно":

sed 's/^[^=]*=/=/' everyone.pls

, Если файл everyone.pls похож:

$ cat everyone.pls
File 1515 = foo.txt
File 1516 = foo=.xls

вышеупомянутая команда производит:

$ sed 's/^[^=]*=/=/' everyone.pls
= foo.txt
= foo=.xls

В regex ^[^=]*=/, ведущее каре означает, что regex должен соответствовать запуску в начале строки. Выражение [^=]*= соответствует каждому символу до и включая первый знак "равно". Поскольку мы хотим знак "равно" в выводе, мы должны заменить все это знаком "равно".

5
ответ дан 8 October 2019 в 10:45

Можно использовать

sed 's/.*=/=/g' everyone.pls

для удаления символов прежде =

3
ответ дан 8 October 2019 в 10:45
sed 's/.*= */=/' YourFile

в Вашем образце там я пространство s после того, как =, что Вы удаляете также, просто 'адаптируйте' другой ответ, которые не принимают его во внимание, но что Вы спрашиваете (до =).

1
ответ дан 8 October 2019 в 10:45

Вот некоторые другие опции, они все удалят все до первого =.

  1. Perl

    perl -pe 's/.+?=/=/' everyone.pls
    

    -p переключатель означает, "печатают каждую строку" после применения сценария, переданного с -e. s/pattern/replacement/ оператор замены, и средства regex соответствуют любому символу до первого =: . средства любой символ и + средства один или несколько и ? делает соответствие нежадным, оно остановится в самой короткой соответствующей строке.

  2. awk

    awk -F= '{$1="=";print;}' everyone.pls 
    

    awk язык сценариев, который автоматически разделяет его вход на поля и делает поля доступными как $1,$2...$N. -F= устанавливает разделителя полей на = и $1="=" поэтому заменит содержание строки, прежде чем первое будет равняться знаку с = и распечатайте остальных.

  3. grep

    grep -o '=.*' everyone.pls 
    

    -o причина grep только распечатать подобранную часть строки. Так, мы ищем первое = вплоть до конца строки.

  4. bash

    while read line; do echo "=${line#*=}"; done < everyone.pls
    

    Это использует некоторое время цикл для чтения каждой строки, сохраняя его в переменной $line и затем с помощью возможностей обработки строк удара изменить его. Конструкция ${variable#pattern} удалит самое короткое соответствие pattern от конца $variable.

  5. Напрасно сложный

    cut -d= -f 2- everyone.pls | sed 's/^/=/'  
    

    cut также работы над полями, -d= заставляет его сократить на =, -f 2- заставляет его распечатать все от 2-го поля в конец строки и sed команда замены добавляет =.

1
ответ дан 8 October 2019 в 10:45

Вы могли бы видеть проблему наоборот и попытаться соответствовать части, которую Вы хотите сохранить:

sed 's:.*\(=.*$\):\1:' everyone.pls

т.е. соответствие почти окружают часть, Вы интересуетесь в скобках тогда, Вы добавляете первую группу назад с \1

0
ответ дан 8 October 2019 в 10:45

Почти право - просто заказало Ваши выражения назад. То, что Вы хотите сделать, заменить все символы, которые не являются = до первого символа, который является = и любой после пробелов с синглом = символ.

Как это:

sed 's/[^=]*= */=/'

Ваше выражение вместо этого заменяет все символы включая и после первого = символ на строке с =.

И не берут в голову начальную букву ^ крайняя левая привязка-; sed вход чтений слева направо так или иначе, и поэтому если это читает во всей входной строке, соответствующей 0 = символы, это ничего не сделает, но для всех других это будет только применяться, это - правило до крайнего левого = o строка.

0
ответ дан 8 October 2019 в 10:45

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

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