Как я исправляю и слишком многих и слишком мало пробелов?

Я не использовал его лично, но похоже, что Крошечный Крошечный RSS мог бы сделать то, что Вы хотите. Это - веб-приложение (Apache + PHP + PostgreSQL), который может генерировать переподачу на основе различных критериев.

2
21.02.2013, 23:19
4 ответа
sed -e 's!<E> *!<E> !g' -e 's! *</E>! </E>!g'

(Примечание: я использовал ! вместо # или / как мой разделитель регулярного выражения. Персональное предпочтение.)

sed может быть передан больше чем одна команда для работы ее входа, пока каждый снабжается префиксом -e флаг.

* после пространства в регулярных выражениях выше средств "соответствуют 0 или больше пробелам". re_format страница справочника дает больше информации о таком повторении:

Атом, сопровождаемый'*'соответствует последовательности 0 или больше соответствий атома. Атом, сопровождаемый'+'соответствует последовательности 1 или более соответствий атома. Атом, сопровождаемый'?'соответствует последовательности 0 или 1 соответствия атома.

где "атом" является подшаблоном перед *, +, или ?.


Выполнение этого sed управляйте на своих примерах:

reedm@www:/tmp $ cat > example.txt
<E>This is text </E>
<E> This is text</E>
<E> This is text     </E>
<E>   This is text </E>
reedm@www:/tmp $ sed -e 's!<E> *!<E> !g' -e 's! *</E>! </E>!g' example.txt 
<E> This is text </E>
<E> This is text </E>
<E> This is text </E>
<E> This is text </E>
3
27.01.2020, 21:51

"по крайней мере одно пространство" / \+/

"нуль или больше пробелов" / */

"не пространство" /[^ ]/

"two or more spaces" is either /   */ or /  \+/
2
27.01.2020, 21:51
  • 1
    sed -i 's#<E>[^ ]#<E> #g' удаляет любой символ, после </E> и замены это с пространством. Так <E>blah </E> становится <E> lah </E>. Вы уверены, что это - правильный синтаксис для "никакого пространства"? –  Questioner 21.02.2013, 05:18
  • 2
    Не "безотносительно символа", но "всего кроме пространства"".> [^]" означает, что "нет никакого пространства после>". Это не мой отказ, что Вы путаете соответствие замене. Любой должен ограничить замену соответствующими строками (взглянули на человека sed, блок об адресах) или необходимо включать подобранное содержание в замену: s#<E>\([^ ]\)#<E> \1# –  Hauke Laging 21.02.2013, 05:34
  • 3
    Холод человек. Я ни в чем не обвинял Вас, просто спросив. Здесь нет никакого "отказа". –  Questioner 21.02.2013, 05:38

echo $STRING | tr -s " "

должен устранить несколько последовательных пробелов и уменьшить их до одиночного пробела. Затем Вам решать, чтобы решить, как Вы хотите обработать тот единственный пробел.

2
27.01.2020, 21:51

Посмотрите на регулярные выражения, обработанные sed(1). Под многими опциями Вы имеете существует \+ повторить предшествование 1 или более раз. Так, sed -i -e 's; \+</E>;</E>;g' *.txt удалит любое количество пробелов прежде </E>. Посмотрите на информационное руководство для GNU sed (я нахожу pinfo(1) самый хороший читатель, но YMMV), странице справочника определенно недостает. Под подробным узлом, перечисляющим проверку "Регулярные выражения".

1
27.01.2020, 21:51

Теги

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