Как я использовал бы sed для обнаружения определенного количества чисел, прежде чем он вставит символ? ###-###-####

По умолчанию NetworkManager использует Dnsmasq в качестве сопоставителя DNS, если он установлен. То, которое является значением по умолчанию на Debian, основывало системы, таким образом, выполнения Dnsmasq в конфигурации по умолчанию, где это только разрешает имена на основе вышестоящих серверов, указанных параметрами командной строки (плюс содержание /etc/hosts). Вы имеете нет /etc/dnsmasq.conf потому что тот файл только присутствует в дополнительном пакете dnsmasq.

Видеть, использует ли Ваша система в настоящее время Dnsmasq или Unbound для запросов DNS, выполненных netstat -ulnp | grep ":53 ".

В Ubuntu 12.04 NetworkManager не играет хорошо с другими сопоставителями DNS (см. ошибку 959037сводка Thomas Hood в значительной степени касается всего этого). Для продолжания бежать Несвязанный вместе с NetworkManager лучший выбор состоит в том, чтобы сказать NetworkManager не выполнять Dnsmasq (Вам не нужен он в дополнение к Несвязанному, не, если Вы не используете функции Dnsmasq, который NetworkManager не использует). Сделать это:

  1. Править /etc/NetworkManager/NetworkManager.conf прокомментировать строку, содержащую dns=dnsmasq (добавьте a # в начале той строки).
  2. Перезапустите NetworkManager с service network-manager restart.

2
14.10.2013, 04:19
2 ответа

Вам нужны числовые кванторы для этого:

sed -r 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/\1-\2-\3/' your_file

-r переключателем, который включает расширенные регулярные выражения, не является POSIX, хотя, таким образом, более портативное решение было бы

perl -pe 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/$1-$2-$3/' your_file

В расширенных регулярных выражениях, кванторе {n,m} средства соответствуют предыдущему атому, по крайней мере, n времена и самое большее m времена. Например, квантор ? может быть выражен как {0,1}. Исключение m средства никакой верхний предел: + может быть записан как {1,}. Наконец, {n} средства соответствуют предыдущему атому точно n времена.

Если Вы хотите использовать sed, у Вас не должно точно быть расширенных регулярных выражений для этого; это просто, что основная форма регулярных выражений была бы менее читаема:

sed 's/\b\([0-9]\{3\}\)\([0-9]\{3\}\)\([0-9]\{4\}\)\b/\1-\2-\3/' your_file
4
27.01.2020, 21:54

Я использовал бы жемчуг для этого вместо этого:

$ perl -pe 's/\b(\d{3})(\d{3})(\d{4})\b/$1-$2-$3/' foo.txt 
atewfnwieug 820-491-9561

adw 891-561-7141 

Можно также сделать это на месте, sed- как:

$ perl -i.bak -pe 's/\b(\d{3})(\d{3})(\d{4})/$1-$2-$3\b/' foo.txt 

Если Ваши номера телефона могут быть смежны с буквами как это:

abcd1234567890abc
abcd1234567890
1234567890abc

можно использовать этого вместо этого:

$ perl -pe 's/([^\d]*)(\d{3})(\d{3})(\d{4})([^\d]*)/$1$2-$3-$4$5/' foo.txt 
abcd123-456-7890abc
abcd123-456-7890
123-456-7890abc

Весь этот выбор предполагает, что номера телефона являются всегда 10 цифрами долго как в Вашем примере.

2
27.01.2020, 21:54
  • 1
    Вы могли бы хотеть привязать шаблон, чтобы не выполнить замену относительно числовых строк дольше, чем 10 цифр. –  Joseph R. 14.10.2013, 03:56
  • 2
    @JosephR. положительная сторона, отредактированный ответ, спасибо. –  terdon♦ 14.10.2013, 04:02

Теги

Похожие вопросы