なぜこんなに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を使って「yes」を「no」に置き換えるより良い方法はありますか?

[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
    ...
}

編集する:

@ilkkachuのおかげでodコマンドの結果

[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エンジンによる)を使用して参照できます。水平[[:blank:]](スペース、タブ、幅の異なる一部のUnicodeインターバル文字\h垂直改行文字(改行、フォームフィード、垂直タブ、またはキャリッジリターンなど)の置き換えは、Microsoftテキストファイルの偽のキャリッジリターンを無視するために[[:space:]]使用されることがあります。[[:blank:]]

交換できませんgrep。これは検索ツールです。代わりに、次yesnoコマンドを使用できます。

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

これは、その単語を単語を含む行にsed置き換え(変更)することを意味します。 ((元/正規表現演算子)は、いくつかの実装では単語の終わりを強制します。yesnodisable\>exvisedスペースで区切られた単語、))も一致しますdisable-option。これは空白の問題を完全に便利に回避します。


注:と同じ行の場合、eyes yes無限のyes置換が最初のインスタンスに適用され、後にyes残りますeno yes。だから私は\<yes\>代わりに使用しますyes

答え2

「disable」と「=」の間の要素が何であるかを知る理由と方法は何ですか?何台か?シート?

ラベルかもしれません。次のようなものを使用できます

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

確認してください。タブはスペースで、スペースはスペースで表示されます\t

答え3

grepの代替案をお試しください画面~からスクリーニングツール.org- スマート正規表現パターンマッチングのためにステリオドをgrepします。

関連情報