なぜこのように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 ~]#

マウスでスペースをコピーするだけで、何も grep されません...

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

編集 :

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

スペースは一般的に「空白」として知られており、スペースだけでなくタブ(およびその他の「空白」文字)も含まれることがあります。正規表現では、これらを( REエンジンに応じて[[:space:]])または\s(REエンジンに応じて)のいずれかで参照することができます。水平(スペース、タブ、および利用可能な場合はさまざまな幅のUnicodeスペース文字)には、[[:blank:]]およびを使用することもできます\h垂直スペース文字 (改行、フォーム フィード、垂直タブ、キャリッジ リターンなど)。Microsoftテキスト ファイル内の不要なキャリッジ リターン文字をカバーするために、[[:space:]]の代わりに使用されることがあります。[[:blank:]]

を で置き換えることはできませんgrep。これは単なる検索ツールです。代わりに、 を で置き換えるには、yesnoのようなコマンドを使用します。

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

これは、単語 を含む行でsed単語yesを に置換(変更)するように指示します。((最初は/正規表現演算子)は、一部の実装では単語の終わりを強制します(ただし、nodisable\>exvised空白で区切られた単語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です

関連情報