Intereting Posts
telnet: «Без типа среды, указанного в терминале». Чтение из дескриптора файла не выполняется Измените только один уровень клавиатуры в .xmodmap Поддерживает ли Linux ThinkPad Helix 2? Задержка при вступлении в силу правил iptables icmp Как изменить разрешения по умолчанию для файлов, созданных процессом? Управление RTC в настольных и встраиваемых средах Как отлаживать, вызваны ли перезагрузки программным обеспечением или оборудованием? Как проверить с вывода «uname -a», установленная ОС Solaris является openSolaris или нет Проблемы с Kazam + Pavucontrol Уникальная настройка монитора синергии Обнаружение, если компьютер был запущен с использованием WOL или выключателя питания Докер с аудио в режиме реального времени / с низкой задержкой? (для виртуальных усилителей, таких как Guitarix …) Игровой контроллер USB Logitech не распознается Доступ к внешнему диску NTFS в centos

Что означает команда sed ‘s / * // g’ в unix?

Я шел через сценарий оболочки Unix, где я наткнулся на эту команду:

sed 's/[^0-9]*//g' 

Может кто-нибудь объяснить это?

Команда

 sed 's/[^0-9]//g' 

будет действовать как фильтр, который пропускает только цифры.

Так бы

 sed 's/[^0-9]*//g' 

Но из-за g в конце * не требуется (подробнее об этом в конце).

Регулярное выражение [^0-9] означает «любой символ, который не является цифрой», а команда sed s/[^0-9]//g означает «заменить любой нецифровый символ ничем, а затем повторите для столько раз, сколько возможно на каждой строке ввода (т. е. не только на первой незначной цифре в каждой строке) “.

Пример:

 $ echo '1-2 1-2? Is this mic on? Hello world! It is 2018!' | sed 's/[^0-9]//g' 12122018 

Это так же, как команда

 tr -dc '0-9\n' 

который также удаляет не-цифру в своем вводе (и оставляет новые строки тоже).


Разница между [^0-9] и [^0-9]* заключается в том, что первый соответствует ровно одному нецифровому символу, а последний соответствует нулю или большему количеству нецифровых символов. Если вы хотите удалить нецифровые символы , вам не нужно сопоставлять пустые строки («ноль» в «ноль или более» выше), поэтому имеет смысл сопоставлять с [^0-9] чем с совпадать с [^0-9]* .

Флаг g в конце команды sed означает «глобально», то есть везде в строке, а не только в первом совпадении. Сняв это, вы заметите, что

 $ echo '123 testing' | sed 's/[^0-9]*//' 123 testing 

соответствует пустому пространству перед 1 и ничего не заменяет. Более наглядный пример этого:

 $ echo '123 testing' | sed 's/[^0-9]*/(&)/' ()123 testing 

… и с g в конце:

 $ echo '123 testing' | sed 's/[^0-9]*/(&)/g' ()1()2()3( testing) 

И тогда у нас есть

 $ echo '123 testing' | sed 's/[^0-9]//' 123testing 

который соответствует и заменяет пробел, который не является цифрой. Более наглядный пример этого:

 $ echo '123 testing' | sed 's/[^0-9]/(&)/' 123( )testing 

… и с g в конце:

 $ echo '123 testing' | sed 's/[^0-9]/(&)/g' 123( )(t)(e)(s)(t)(i)(n)(g) 

sed 's/[^0-9]*//g' означает удаление нецифровых символов.

пример

 echo alsal34las | sed sed 's/[^0-9]*//g' 

получит 34

Если вы хотите узнать больше об этом, я предлагаю вам взглянуть на регулярное выражение .

@Purushottam Кумар,

 S = search g = Global [^0-9]* = Searching only for the numbers starting with 0-9 in the whole document. //g = To remove all other content other than numeric. 

Чтобы прочитать больше ниже ссылка может помочь вам.

GNU Sed Документация

Конечно,

 sed 's/[^0-9]*//g 

sed – это «streamовый редактор», для помещения в конец канала ( | ) перенаправления (например, <<< , как в sed 's/[^0-9]*//g' <<< 'yourstring123' или используя непосредственно файл (например, sed 's/[^0-9]*//g' /your/filename ).

Команда s в sed ссылается на «замену» для замены символов:

 $ sed 's/pattern/replacment/' <<< 'pattern123pattern' replacement123pattern 

Модификатор g в конце означает «глобальный» для замены по всей строке:

 $ sed 's/pattern/replacement/g' <<< 'pattern123pattern' replacement123replacement 

[^0-9]* - это регулярное выражение , в котором происходит волшебство этой команды.

 [: begin matching ^: NOT these characters: 0-9: 0 through 9 ]: end match *: match 0 or more occurances 

например, [^0-9]* будет соответствовать всему, что не является числом в диапазоне от 0 до 9:

sed 's/[^0-9]*//g' : заменить все нечисловые символы пустой строкой ('').

 $ sed 's/[^0-9]*//g' <<< 'pattern123pattern' 123 $ sed 's/[^0-9]*//g' <<< '123qwertyui456opasdfghjklzxcvbnm789,./;[]=`~012+:"{}<>?345' 123456789012345 

Смотрите man sed(1) и regex(7) для получения дополнительной информации.

Прямой ответ – он ищет все вхождения числовых в буквенно-цифровой текст и удаляет их.

Пояснение –

  sed 's/[^0-9]*//g' filename 

состоит из следующих компонентов.

  1. s/search_pattern/new_pattern/options – заменить (найти и заменить)
  2. [] – регулярное выражение.
  3. * – подстановочный знак для 0 или более вхождений.
  4. g – глобальный (опция – заменяет все вхождения в этой строке)

Давайте разберемся с каждым компонентом

1. sed ‘s / search_pattern / new_pattern / options’ имя файла

sed ‘s / akshat / saxena /’ file.txt

Он ищет в каждой строке шаблон «акшат» и заменяет только его первое вхождение на «саксена» в файле с именем file.txt

Здесь мы можем указать такие параметры, как g (global), i (игнорировать регистр)

  (i) g(global) Discussed in point 4. (ii) i - searches ignoring case (case- insensitive search) sed ' s/life/love/i' file.txt Replace life/Life/lIfe/liFe/life/lifE (and many more) with love 

2. Регулярное выражение с использованием []

В регулярном выражении можно искать другую комбинацию или диапазон значений.

  sed 's/[Li][Ii][Ff][Ee]/love/g' file 

означает, что шаблон имеет L или l, затем I или i, затем F или f, а затем E или e. Таким образом, поиск становится нечувствительным к регистру.

Если требуется диапазон, используется тире (-). [az] означает маленькие буквы от a до z, то есть все буквенные символы. [0-9] означает от 0 до 9, то есть все числовые символы.

Таким образом, в данном коде это относится к поиску всех числовых символов.

3. *

На его месте может присутствовать любой персонаж. Таким образом, в данном коде любой символ может следовать регулярному выражению [0-9]

4. г (глобальный)

  replace all occurrence in that line. Inorder to replace first occurence in particular line use 

Файл sed ‘ns / akshat / $$ /’

  where n is the line number. 

Приведенный выше код заменяет шаблон «акшат» на $$ в n-й строке.