2014-06-09 1 views
1

Я хочу отредактировать строку, которую я получаю, используя регулярное выражение в оболочке linux, но мне не удалось.как заменить строку повторного шаблона при его запуске, терминал linux?

вещь, которую я хочу сделать, это в начале строки, чтобы изменить repeatedlly вхождение «00» до «1»

Пусть говорят: 00000120001 to 110100001, но я не в этом.

Я пробовал:

echo 00000120001 | sed 's/^\`\<00/1/g' 

но получил 1000120001

ответ

1

Не уверен, что вы можете сделать он с одним регулярным выражением; У меня есть решение с жонглированием с трюмом и узорными пространствами sed.

В одной строке:

sed 'h;s/[^0].*//;s/00/1/g;x;s/^0*//;x;G;s/\n//' <<< '00000120001' 

С деталями:

sed 'h   # copy input line to hold space 
    s/[^0].*// # keep only 00..0 preffix in pattern space 
    s/00/1/g # replace double 0s by 1s in pattern space 
    x   # swap hold and pattern spaces (hold is now 110, pattern 00000120001 
    s/^0*// # remove 00..0 prefix from pattern space 
    x   # swap hold and pattern spaces (hold is now 120001, pattern 110 
    G   # append hold space to pattern space (pattern is 110\n120001) 
    s/\n//' # remove \n from pattern 
<<< '00000120001' 
+1

это работа большой, но мне пришлось изменить его на: echo 00000120001 | sed 'h; s/1. * //; s/00/1/g; x; s/^ 0 * //; x; G; s/\ n //' –

+0

Работа синтаксиса '<<<' для оболочки bash. При использовании этого я забыл добавить тэг 'csh' в ваш вопрос. Виноват. – Qeole

2

с помощью командной строки Perl:

echo 00000120001 | perl -pe 's/(?|^(.)|\G(?<=(.))\1)\1/1/g' 

Для нуля только:

echo 00000120001 | perl -pe 's/\G00/1/g' 
0

Использование gnu awk вы можете сделать:

echo '00000120001' | awk '$0==""{printf "1"} $0 && !index($0, "\n") 
      {p=1; printf $0 RS; next} $0{printf $0}' RS='00' 
110120001