2015-07-21 2 views
0

У меня трудно понять, число разбора патч в следующей команде я видел в this article:Как этот командный код команды командует запятыми?

sed -i ':a;s/\B[0-9]\{3\}\>/,&/;ta' numbers.txt 

Я sed новичку, так это то, что я был в состоянии выяснить:

  • & добавляет к тому, что уже есть, а не подменяли
  • :a; ... ;ta вызывает замену рекурсивно на линии, пока поиск не находит больше прибыли

Вот что я надеюсь, люди могут объяснить

  • Что -i делать? Кажется, я не могу найти его на страницах руководства, хотя я уверен, что он там.
  • Я немного расплывчатый от того, что делает здесь \B? Возможно, это помогает с приоритетом левого правого разбора, но я не вижу, как это сделать. Итак, наконец ...
  • Самое главное, почему это выполняется справа налево, а не слева направо? Например, какая часть команды держит это делать что-то вроде: 1234566778,9 ---> 1234,566,778,9
+1

Это может быть несколько более понятным: 'sed -i -r ': a; s/([0-9]) ([0-9] {3}) \>/\ 1, \ 2 /; ta'' - найти число, за которым следуют 3 числа, за которыми следует граница слова, и вставить запятую перед группой из трех чисел. –

ответ

2

Соответствие является жадным, т.е. оно соответствует самые левые три цифры НЕ предшествует граница слова и , за которой следует граница слова, то есть самые правые три цифры. После вставки запятой «goto» заставляет его снова совпадать, но запятая вводит новую границу слова, поэтому совпадение происходит раньше.

3

Рассекайте эту команду:

sed -i ':a;s/\B[0-9]\{3\}\>/,&/;ta' numbers.txt 

-i  # inline editing to save changes in input file 
\B  # opposite of \b (word boundary) - to match between words 
[0-9] # match any digit 
\{3,\} # match exact 3 digits 
\>  # word boundary 
&  # use matched pattern in replacement 
:a  # start label a 
ta  # go back to label a until \B[0-9]\{3\}\> is matches 

Да, действительно это СЕПГ команда начинает матч/замена справа максимум 3 цифр и сохраняет идя налево, пока не найдет 3 цифры.


Обновление: Однако глядя на эту неэффективного SED команды в цикле я рекомендую этот намного проще и быстрее AWK вместо:

awk '/^[0-9]+$/{printf "%\047.f\n", $1}' file 
20,130,607,215,015 
607,220,701 
992,171 

Где входной файл:

cat file 
20130607215015 
607220701 
992171 
+0

благодарит за такое четкое объяснение, но почему этот синтаксический анализ правилен справа налево, а не наоборот? – sunny

+1

Это из-за '\ B' (между словом) на LHS и' \> '(граница слова) на RHS. – anubhava

+1

«\ B» имеет решающее значение, иначе sed застревает в бесконечном цикле на число «123», –

Смежные вопросы