
Я хотел бы изменить строку «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
/ vi
regexp) в некоторых 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 на стероидах, который выполняет интеллектуальное сопоставление шаблонов регулярных выражений