Почему "sed-e" s/[0-9]*/& &/" имеют ли очень разные результаты с незначительными изменениями входных данных?

Почему "sed-e" s/[0-9]*/& &/" имеют ли очень разные результаты с незначительными изменениями входных данных?

28.01.2020 09:20:04 Просмотров 19 Источник

Я пытаюсь понять ниже результат и различия, почему результат не abc 123 123, когда [0-9]* будет соответствовать 123

  • Почему этот первый ответ не abc 123 123?

    $ sed -e 's/[0-9]*/& &/' <<<'abc 123'
     abc 123
    
  • Почему второй результат 123 123 abc?

    $ sed -e 's/[0-9]*/& &/' <<<'123 abc'
    123 123 abc
    
  • Почему в третьем есть лишние места?
    $ sed -e 's/[0-9]*/& &/g' <<<'abc 123'
     a b c  123 123
    
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59954818/why-does-sed-e-s-0-9-have-very-different-results-with-minor-input-c#comment106029851_59954818
Пожалуйста, старайтесь задавать свои вопросы, сформулированные так, чтобы они были понятны людям, которые не могут просматривать скриншоты, по причинам, описанным в разделе почему бы не загружать изображения кода на SO при задании вопроса?
https://stackoverflow.com/questions/59954818/why-does-sed-e-s-0-9-have-very-different-results-with-minor-input-c#comment106030026_59954818
И вообще, задавайте только один вопрос на вопрос. Третий пункт-это почти полностью отличный от двух других вопрос (и, что важно, он уже был задан и на него ответили в другом месте нашей базы знаний, поэтому, если бы он был задан отдельно, мы могли бы просто закрыть вопрос как дубликат; вместо этого все это становится приемлемым для закрытия как "слишком широкое").

Ответы - Почему "sed-e" s/[0-9]*/&amp; &amp;/" имеют ли очень разные результаты с незначительными изменениями входных данных? / Why does `sed -e 's/[0-9]*/& &/'` have very different results with minor input changes?

Является ответом!
that other guy

28.01.2020 09:24:55

sedбудет использовать первую спичку. Поскольку [0-9]*соответствует не только 3 цифрам 123, но и 0 цифрам (пустой строке), он будет соответствовать пустой строке, отмеченной здесь скобками: ()abd 123и заменит ее на () ()abd 123

Если вы вместо этого используете один из:

sed -r 's/[0-9]+/& &/'
sed 's/[0-9][0-9]*/& &/' 

затем вы требуете, чтобы он соответствовал хотя бы 1 цифре, и тогда он будет вести себя так, как вы ожидаете.

https://stackoverflow.com/questions/59954818/why-does-sed-e-s-0-9-have-very-different-results-with-minor-input-c/59954883#comment106030359_59954883
когда вы говорите, что пустая строка-это граница слова? Да, на этот раз я вижу в результате пространство , так это <WB><WB><SPACE><SPACE><WB>abc 123? по первому вопросу
https://stackoverflow.com/questions/59954818/why-does-sed-e-s-0-9-have-very-different-results-with-minor-input-c/59954883#comment106030492_59954883
Это не связано с границами слов. Вот границы слов, отмеченные символом|: |abc| |123|. Вот возможные совпадения для пустых строк (между aи b есть 0 символовb
https://stackoverflow.com/questions/59954818/why-does-sed-e-s-0-9-have-very-different-results-with-minor-input-c/59954883#comment106030751_59954883
понятно наконец, как только sed находит первое совпадение длины 0 символов (я называю нулевой символ как " | "для моего понимания) из шаблона / [0-9]* / его заменяют на | < пробел> / так что конечный результат:" | < пробел><пробел>| / a|b|c| |1|2|3|" ?
Закрыть X