Обработка текста в bash - извлечение информации между несколькими тегами HTML и вывод ее в формат CSV [дубликат]

Это может быть правдой, что:

  1. Кто-то использует каждую функцию языка / библиотеки, а
  2. . Переключение поведения здесь было бы непродуманным, но

полностью согласуется с обоими вышеперечисленными функциями и по-прежнему делает еще одну точку:

  1. Это запутанная функция, и это несчастливо в Python.

Другие ответы или, по крайней мере, некоторые из них либо делают точки 1 и 2, но не 3, либо делают точки 3 и нижние точки 1 и 2. Но все три являются истинными.

Возможно, что переключение лошадей в середине потока здесь потребует значительного поломки и что может возникнуть больше проблем, связанных с изменением Python, чтобы интуитивно обработать открывающий фрагмент Стефано. И это может быть правдой, что кто-то, кто хорошо знал внутренности Python, мог объяснить минные поля последствий. Однако

Существующее поведение не является Pythonic, а Python успешным, потому что очень мало о языке нарушает принцип наименьшего удивления где-нибудь возле , это плохо , Это настоящая проблема, было бы разумно ее искоренить. Это дефект дизайна. Если вы понимаете язык намного лучше, пытаясь проследить поведение, я могу сказать, что C ++ делает все это и многое другое; вы многому научитесь, перейдя, например, на тонкие ошибки указателя. Но это не Pythonic: людям, которые заботятся о Python достаточно, чтобы упорствовать перед лицом этого поведения, являются люди, которые тянутся к этому языку, потому что у Python гораздо меньше сюрпризов, чем на другом языке. Dabblers и любопытные становятся Pythonistas, когда они удивляются тому, как мало времени требуется, чтобы получить что-то работающее - не из-за дизайна fl - я имею в виду, скрытая логическая головоломка - которая урезает интуицию программистов, которые тянутся к Python потому что он просто работает.

7
задан theta 24 December 2011 в 13:36
поделиться

4 ответа

sed - инструмент на основе строк. Я не думаю, что это вариант. Вы можете использовать h/H (hold), g/G (get).

$ echo -e 'one\ntwo\nthree' | sed -n '1h;1!H;${g;s/one.*two/one/p}'
one
three

Возможно, вам стоит попробовать vim

:%s/one\_.*two/one/g
4
ответ дан kev 21 August 2018 в 18:26
поделиться
  • 1
    Спасибо за подсказку, но я не чувствую себя комфортно в vim (я новый пользователь Linux). Оператор AFAIK m / M используется, чтобы сообщить sed переключиться в многострочный режим – theta 24 December 2011 в 13:53
  • 2
    Я просто видел ваше отредактированное решение. Кажется загадочным, но это правильный ответ, я думаю. благодаря – theta 24 December 2011 в 13:59
  • 3
    @zetah Hold все, чтобы hold-space, затем get он, и выполните замену. – kev 24 December 2011 в 14:09

Как насчет двух вызовов sed: (сначала избавитесь от «двух», затем избавьтесь от пустой строки)

$ echo -e 'one\ntwo\nthree' | sed 's/two//' | sed '/^$/d'
one
three

На самом деле, я предпочитаю Perl для однострочных над Python:

$ echo -e 'one\ntwo\nthree' | perl -pe 's/two\n//'
one
three
1
ответ дан AAAfarmclub 21 August 2018 в 18:26
поделиться

Вы можете использовать python следующим образом:

$ echo -e "one\ntwo\nthree" | python -c 'import re, sys; s=sys.stdin.read(); s=re.sub("(?s)one.*two", "one", s); print s,'
one
three
$

Это считывает стандартный входной сигнал python (sys.stdin.read()), затем заменяет «один» на «один.» два »на dot соответствует всем установленным параметрам (используя (?s) в начале регулярного выражения), а затем печатает измененную строку (конечная запятая в печати используется, чтобы предотвратить добавление новой строки новой строки).

3
ответ дан Adam Zalcman 21 August 2018 в 18:26
поделиться
  • 1
    Отличный, отличный совет, спасет меня от будущих неприятностей. Я пропускаю простые многострочные шаблоны, к которым я привык в RegexBuddy в Windows, а затем аналогично простому модулю в Python, что я буду искать еще один общий код ActiveState и сделать его доступным как системная команда. ура – theta 24 December 2011 в 14:13

Это может сработать для вас:

<<<$'one\ntwo\nthree' sed '/two/d'

или

<<<$'one\ntwo\nthree' sed '2d'

или

<<<$'one\ntwo\nthree' sed 'n;d'

или

<<<$'one\ntwo\nthree' sed 'N;N;s/two.//'

Sed соответствует всем символам (включая \n), используя точку ., но обычно она уже отключила \n как часть цикла, поэтому она больше не присутствует в пространстве шаблонов

Только некоторые команды (N, H и G) сохраняют символы новой строки в пространстве шаблона / удержания.

  1. N добавляет newline в пространство шаблонов, а затем добавляет следующую строку.
  2. H делает то же самое, за исключением того, что он действует на удержание.
  3. G добавляет новую строку к шаблону пробел, а затем добавляет все, что находится в пространстве удержания.

Пространство удержания пусто, пока вы не поместите в него что-то, чтобы:

sed G file

введет пустую строка после каждой строки.

sed 'G;G' file

вставляет две пустые строки и т. д. и т. д.

1
ответ дан potong 21 August 2018 в 18:26
поделиться
Другие вопросы по тегам:

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