2017-02-08 13 views
1

Я пытаюсь добавить ведущие нули в почтовые индексы, которые имеют 4 цифры - мне нужно использовать команду sed, так как это часть некоторой подготовки. Мой код ниже, кажется, продолжает терпеть неудачу, но я не могу найти в этом ничего плохого.sed: добавить ведущий ноль к почтовым индексам

Я не очень хорошо знаком с Unix/Bash или sed, поэтому любая помощь с объяснением будет принята с благодарностью!

sed -r 's/\<[0-9]{4}\>/0&/' 

Это ошибка я получаю, когда тестовый скрипт запускается, чтобы обеспечить свои результаты в порядке:

Expected: 
[['12963' '40'] 
['09993' '12'] 
['99993' '1'] 
['01003' '1234']] 
Received: 
[['12963' '40'] 
['9993' '12'] 
['99993' '1'] 
['1003' '1234']] 
+0

Можете ли вы уточнить, как это происходит? (Дает ли она ошибку? Если да, то какой * точный * текст этой ошибки? Он просто сидит там? Если да, то как вы его подаете?) –

+1

Также вы можете привести пример ввода, который вы 'тестирование с? См. Http://stackoverflow.com/help/mcve –

+1

Кроме того, поскольку только приемлемый ответ на основе 'sed', это, возможно, * не является вопросом bash вообще *, поскольку' sed' не встроен, распределенными с или, что то же самое, частью bash. –

ответ

1

Он должен работать, если вы перенаправив вывод STDIN из таких команд, как echo или cat.

echo '4121' | sed -r 's/[0-9]{4}/0&/' # Output: 04121 
echo 'h3llo41world' | sed -r 's/[0-9]{4}/0&/' # Output: h3llo41world 
echo 'h3llo4121world' | sed -r 's/[0-9]{4}/0&/' # Output: h3llo04121world 
echo '1341' | sed -r 's/\<[0-9]{4}\>/0&/' # Output: 01341 
echo 'a1341' | sed -r 's/\<[0-9]{4}\>/0&/' # Output: a1341 

-r Среднее расширенное регулярное выражение.

[0-9]{4} означает, что вы найти четыре цифры в строке

0& означает добавить ноль и заменить амперсанд & с любым матчем вы нашли в левой стороне.

\< и \> - граничные условия. Итак, в примере 4 выше, регулярное выражение совпадает, но в примере 5 регулярное выражение не совпадает.

1

Я думаю, вы намеревались использовать \( и \) для захвата согласованной части, а не \< и \>. Поскольку у вас есть только одна соответствующая часть, здесь будет достаточно &.

Это лучше сделать ваш sed более устойчивым - он не должен шалить, когда почтовый индекс имеет 5 цифр уже:

echo 95014 | sed -E 's/^[0-9]{4}$/0&/' => 95014 
echo 5014 | sed -E 's/^[0-9]{4}$/0&/' => 05014 

выше sed выражение ищет строки, которые имеют только 4 цифры, как мы использовали ^ (начало строки) и $ (конец строки) якоря.


Ограничение выше sed команды является то, что он будет делать 0 отступы только тогда, когда ваша строка имеет 4-х цифр. Вам нужно добавить дополнительные выражения для обработки случаев с 3, 2 и 1 знаками почтовых индексов.

+0

Странно, похоже, это не работает. Что должен делать '-E'? – vashts85

+0

'-E' означает расширенное регулярное выражение. Вставьте ошибку, которую вы получаете. Это работает для меня на Ubuntu 14.04. – codeforester

+2

'-E' является расширением BSD, которое GNU также поддерживает (в то время как собственный флаг GNU для включения ERE -' -r'), но это не-POSIX, поэтому, хотя доступность широкая, она не является неограниченной. –

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

  • Нет связанных вопросов^_^