Почему я не могу воспользоваться grep таким образом?

Почему я не могу воспользоваться grep таким образом?

Я хотел бы изменить строку «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

решение1

Пробелы более известны как «пробелы» и могут включать не только пробелы, но и табуляции (и другие «пустые» символы). В регулярном выражении вы часто можете ссылаться на них либо с помощью, [[:space:]]либо \s(в зависимости от движка RE), что включает в себя обагоризонтальный(пробел, табуляция и некоторые символы пробела Unicode различной ширины, если они доступны), для которых вы также можете использовать [[: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.

решение2

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

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

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

чтобы увидеть. Он будет показывать табуляции как \t, а пробелы как пробелы.

решение3

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

Связанный контент