なぜこの方法でgrepできないのですか?


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 ~]#

私のマウスでスペースをコピーするだけで、それは何もグレップしません...

「無効化」と「=」の間の要素が何であり、どのようにしてわかりますか?いくつかのスペースですか?集計?

私は次の正規表現を使用して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

回答:


12

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

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

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

これはsed、単語を含む任意の行で単語yesnoに置き換える(変更する)ことを示していますdisable。(\>(最初はex/ viregexp演算子)は、一部のsed実装では、単語の終わりを強制します(ただし、空白で区切られた単語ではないことに注意してくださいdisable-option)。便利なことに、これは空白の問題を完全に回避します。


注意:などの行を使用するeyes yesと、無制限のyes置換がの最初のインスタンスに適用され、そのyesままになりますeno yes。それが、私がの\<yes\>代わりに使用した理由yesです。


説明は十分ですが、うまくいきません。
Pozinux 2017年

1
@Pozinux私はあなたdisableが行頭にいないことを知りませんでした。それに応じてREを修正しました。
roaima

まだ変更はありません。
Pozinux 2017年

2
あなたは正しい、実際-私はそれを再現することができます。sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'私も動作しません(MacOS、BSD sed)。しかし、OPの元のコードは、GNU sed(v4.4)でうまく動作します。
Charles Duffy

1
言うつもりだった-私にとってはうまく機能するdocker run -i centos:latest sed '/disable\>/s/\<yes\>/no/' <<<' disable = yes'
Charles Duffy

6

「無効化」と「=」の間の要素が何であり、どのようにしてわかりますか?いくつかのスペースですか?集計?

おそらくタブ。あなたは次のようなものを使うことができます

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

見る。タブは\t、スペースはスペースとして表示されます。


odコマンドを知りませんでした。odコマンドの結果が見えるように質問を編集しました。私が理解している場合、「無効」と「=」の間にタブはありませんか?しかし、いくつですか?それらを数えることはできますか?
Pozinux 2017年

1
@Pozinuxなので、タブはありません。最初grepはうまくいかない理由はわかりません。申し訳ありません
ilkkachu

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.