У меня есть текстовый файл, и я должен избавиться от всей информации незадолго до = символ в каждой строке, например:
Строка:
File 1515 = foo.txt
потребности быть похожими на это:
=foo.txt
Так, у меня было это использование строки sed
:
sed s/=[^=]*^// everyone.pls
но это удаляет все символы после = символ.
Так, мой вопрос: как я могу удалить символы прежде =
?
Не забывайте, что я не хочу удалять =
символ, мне нужно незадолго до него.
Удалить все перед первый знак "равно":
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 должен соответствовать запуску в начале строки. Выражение [^=]*=
соответствует каждому символу до и включая первый знак "равно". Поскольку мы хотим знак "равно" в выводе, мы должны заменить все это знаком "равно".
Можно использовать
sed 's/.*=/=/g' everyone.pls
для удаления символов прежде =
sed 's/.*= */=/' YourFile
в Вашем образце там я пространство s после того, как =
, что Вы удаляете также, просто 'адаптируйте' другой ответ, которые не принимают его во внимание, но что Вы спрашиваете (до =
).
Вот некоторые другие опции, они все удалят все до первого =
.
Perl
perl -pe 's/.+?=/=/' everyone.pls
-p
переключатель означает, "печатают каждую строку" после применения сценария, переданного с -e
. s/pattern/replacement/
оператор замены, и средства regex соответствуют любому символу до первого =
: .
средства любой символ и +
средства один или несколько и ?
делает соответствие нежадным, оно остановится в самой короткой соответствующей строке.
awk
awk -F= '{$1="=";print;}' everyone.pls
awk
язык сценариев, который автоматически разделяет его вход на поля и делает поля доступными как $1,$2...$N
. -F=
устанавливает разделителя полей на =
и $1="="
поэтому заменит содержание строки, прежде чем первое будет равняться знаку с =
и распечатайте остальных.
grep
grep -o '=.*' everyone.pls
-o
причина grep
только распечатать подобранную часть строки. Так, мы ищем первое =
вплоть до конца строки.
bash
while read line; do echo "=${line#*=}"; done < everyone.pls
Это использует некоторое время цикл для чтения каждой строки, сохраняя его в переменной $line
и затем с помощью возможностей обработки строк удара изменить его. Конструкция ${variable#pattern}
удалит самое короткое соответствие pattern
от конца $variable
.
Напрасно сложный
cut -d= -f 2- everyone.pls | sed 's/^/=/'
cut
также работы над полями, -d=
заставляет его сократить на =
, -f 2-
заставляет его распечатать все от 2-го поля в конец строки и sed
команда замены добавляет =
.
Вы могли бы видеть проблему наоборот и попытаться соответствовать части, которую Вы хотите сохранить:
sed 's:.*\(=.*$\):\1:' everyone.pls
т.е. соответствие почти окружают часть, Вы интересуетесь в скобках тогда, Вы добавляете первую группу назад с \1
Почти право - просто заказало Ваши выражения назад. То, что Вы хотите сделать, заменить все символы, которые не являются =
до первого символа, который является =
и любой после пробелов с синглом =
символ.
Как это:
sed 's/[^=]*= */=/'
Ваше выражение вместо этого заменяет все символы включая и после первого =
символ на строке с =
.
И не берут в голову начальную букву ^
крайняя левая привязка-; sed
вход чтений слева направо так или иначе, и поэтому если это читает во всей входной строке, соответствующей 0 =
символы, это ничего не сделает, но для всех других это будет только применяться, это - правило до крайнего левого =
o строка.