Проблема регулярного выражения Sed с сопоставлением от ^ до " с чем-либо между

Решение awk:

wc -l /path/to/dir/* | head -n -1` | awk '$1>1 {print $2}' | xargs rm

Примечания:

  • В этой простой версии нет поддержки специальных символов
  • Помните, что wc -lсчитает не строки, а количество переводов строки. Таким образом, файл с двумя строками (, но без LF на второй ), будет сообщен как имеющий строку «1».
-1
24.06.2021, 17:47
6 ответов

Чего вам не хватает, так это того, что .*соответствует жадно , потребляя столько символов, сколько может (, включая любые "до последнего ).

Вы можете либо исключить "из «всего между», используя [^"]*, либо переключиться на движок регулярных выражений, который предоставляет не -жадный модификатор, такой как Perl.*?

$ printf '%s\n' 'href="https://unix.stackexchange.com/"' | sed 's/^[^"]*"//'
https://unix.stackexchange.com/"

$ printf '%s\n' 'href="https://unix.stackexchange.com/"' | perl -pe 's/^.*?"//'
https://unix.stackexchange.com/"

OTOH, если вам действительно нужен пустой URL-адрес, вы можете сопоставить и захватить все, что находится между первой и последней цитатой, и использовать обратную ссылку для повторной -замены только этого:

$ printf '%s\n' 'href="https://unix.stackexchange.com/"' | sed 's/^[^"]*"\(.*\)"/\1/'
https://unix.stackexchange.com/

Исходное выражение ^[^"]*больше не обязательно должно быть не -жадным и может быть заменено на ^.*в этом контексте, поскольку регулярное выражение в целом не может потреблять первое ", по-прежнему совпадая с second (хотя жадность может привести к ненужному возврату ).

2
28.07.2021, 11:22

Вы можете сопоставить все до первого"с:

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

Это будет соответствовать с начала строки ^нескольким (нулю или более*)символов, которые являются не двойными кавычками ([^"]), за которыми следует двойная кавычка ".

0
28.07.2021, 11:22
awk -F "=" '{gsub("^\"","",$2);print $2}' filename

выход

https://unix.stackexchange.com/"

Предположим, если вы хотите удалить завершающие кавычки, мы можем использовать приведенную ниже команду

awk -F "=" '{gsub("\"","",$2);print $2}' filename

выход

https://unix.stackexchange.com/
0
28.07.2021, 11:22

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

awk '{print gensub(/(^.*")(.*")/, "\\2", "g");}' input

В этой команде gawk, встроенная -в функцию gensub(), заменяет все захваченные группы второй захваченной группой, используя обратную ссылку(\\2).

Если мы хотим удалить завершающую кавычку, то команду можно изменить на эту:

awk '{print gensub(/(^.*")(.*)(")/, "\\2", "g");}' input
0
28.07.2021, 11:22

Если вы не хотите полагаться на знак равенства, это должно сработать.

Эти первые два работают только с grep, который поддерживает PCRE, а GNU grepна вашем ubuntuподдерживает:

printf "%s\n" 'href="https://unix.stackexchange.com/"' | grep -Po '(?<=")[^"]*'

Или

printf "%s\n" 'href="https://unix.stackexchange.com/"' | grep -Po '(?<=").+(?=")'

Они бегают повсюду:

printf "%s\n" 'href="https://unix.stackexchange.com/"' | sed 's/[^"]*//; s/"//g'

Или

printf "%s\n" 'href="https://unix.stackexchange.com/"' | awk -F '"' '{print $2}
0
28.07.2021, 11:22

Для этого cutбыла изобретена такая работа:

$ cut -d'"' -f2 file
https://unix.stackexchange.com/
2
28.07.2021, 11:22

Теги

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