Почему я не могу пойти по этому пути?

8

Я хотел бы изменить строку «disable = yes» на «disable = no» в следующем файле:

[root@centos2 ~]# cat /etc/xinetd.d/tftp
service tftp
{
    ...
    server_args             = -s /var/lib/tftpboot
    disable                 = yes
    per_source              = 11
    ...
}  

Я попробовал это:

[root@centos2 ~]# grep 'disable                 = yes' /etc/xinetd.d/tftp
[root@centos2 ~]#

просто скопировав пространство моей мышью, но оно ничего не показывает ...

Почему и как я могу узнать, какие элементы находятся между "disable" и "="? Это несколько пробелов? табулирование?

Я знаю, что я могу grep, используя следующее регулярное выражение:

[root@centos2 xinetd.d]# grep -E 'disable.+= yes' /etc/xinetd.d/tftp
    disable                 = yes
[root@centos2 xinetd.d]#

И наконец, есть ли лучший способ заменить «да» на «нет» с помощью sed, чем следующий:

[root@centos2 xinetd.d]# sed -r 's/disable.+= yes/disable                 = 
no/g' /etc/xinetd.d/tftp

service tftp
{
    ...
    server_args             = -s /var/lib/tftpboot
    disable                 = no
    per_source              = 11
    ...
}

РЕДАКТИРОВАТЬ :

Результат команды od благодаря @ilkkachu

[root@centos2 xinetd.d]# < /etc/xinetd.d/tftp grep disable | od -c
0000000  \t   d   i   s   a   b   l   e
0000020                                       =       y   e   s  \n
0000037
Pozinux
источник

Ответы:

12

Пробелы чаще называются «пробелами» и могут включать не только пробелы, но и табуляции (и другие «пустые» символы). В регулярном выражении вы часто можете ссылаться на них либо с помощью ( [[:space:]]или \s(в зависимости от механизма RE)), которая включает в себя как горизонтальные (пробел, табуляция, так и некоторые символы интервала Юникода различной ширины, если доступны), для которых вы также можете использовать, [[:blank:]]а иногда \hи вертикальный интервал символы (например, перевод строки, перевод формы, вертикальная табуляция или возврат каретки). [[:space:]]иногда используется вместо [[:blank:]]для покрытия ложного символа возврата каретки в текстовых файлах Microsoft.

Вы не можете заменить на grep- это просто инструмент поиска. Вместо того , чтобы заменить yesс noвами можно использовать команду:

sed '/disable\>/s/\<yes\>/no/' /etc/xinetd.d/tftp

Это говорит , sedчтобы заменить (изменить) слово yesв noлюбой строке, содержащей слово disable. (Оператор \>(изначально оператор ex/ viregexp) в некоторых sedреализациях принудительно вводит конец слова (хотя имейте в виду, что это не пробельные слова , он также будет соответствовать disable-option)). Удобно, что это полностью обходит проблему пробелов.


Будьте осторожны: с такой строкой, как eyes yesнеограниченная yesзамена будет применяться к первому экземпляру yesи оставить вас с eno yes. Вот почему я использовал \<yes\>вместо просто yes.

roaima
источник
Это хорошо объяснено, но у меня не работает.
Pozinux
1
@Pozinux Я не видел, что ты disableне был в начале строки. Я исправил свой RE соответственно.
Ройма
Все еще без изменений извините.
Pozinux
2
Вы правы, на самом деле - я могу воспроизвести это. sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'у меня тоже не работает (на MacOS, с BSD sed). Оригинальный код OP хорошо работает для меня с GNU sed (v4.4).
Чарльз Даффи
1
Собирался сказать - у меня отлично работаетdocker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
Чарльз Даффи
6

Почему и как я могу узнать, какие элементы находятся между "disable" и "="? Это несколько пробелов? табулирование?

Возможно вкладки. Вы могли бы использовать что-то вроде

< /etc/xinetd.d/tftp grep disable | od -c

увидеть. Он будет отображать вкладки как \tи пробелы как пробелы.

ilkkachu
источник
Не знал о команде od, очень приятно! Я отредактировал свой вопрос, чтобы вы могли видеть результат команды od. Если я понимаю, нет никаких вкладок между "отключить" и "=" это правильно? А сколько? Можем ли мы их посчитать?
Pozinux
1
@Pozinux, так что никаких вкладок. Я не вижу никакой причины, почему это первое grepне должно работать, извините
ilkkachu
0

Попробуйте Grep альтернативу под названием просеять из sift-tool.org - это Grep на стероидах , что делает умный регулярок соответствие шаблону

Брэндон Хаберфельд
источник
Как это будет работать в этой ситуации? Можете привести пример?
Ройма