Почему `sed -e 's / [0-9] * / & & /'` дает очень разные результаты с незначительными изменениями ввода? - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь понять приведенный ниже результат и различия, почему результат не ab c 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
    

1 Ответ

3 голосов
/ 28 января 2020

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

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

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

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

...