edテキストエディタを使用して、最初のシンボルが異なるRegExpの最初の単語をキャプチャする方法

edテキストエディタを使用して、最初のシンボルが異なるRegExpの最初の単語をキャプチャする方法

シェルコマンドがあります。

printf '/^PermitRootLogin/\nc\nPermitRootLogin no\n.\nw\nq\n' | ed -s /etc/ssh/sshd_config

文でこのフレーズを使用して、類似しているが#PermitRootLoginコメントPermitRootLoginされていない段落をキャプチャする必要があります。私はedテキストエディタを使用しており、RegExpを使用してそのコマンドのすべてのエントリをキャプチャする方法を見つけようとしています。

このOSにはGNUユーティリティはありません。答えてくれてありがとう!

答え1

正規表現はシェルグローブパターンと同じではありません。これは行の先頭に一致し、前のサブ式の0または1(この場合)を表す^?ため、正規表現として有効な意味はありません。^?^

この試み:

grep `^.?SomeString`

説明する:

^           anchors the match to the start of the line
.?          means 0 or 1 of any character
SomeString  match "Somestring"

答え2

独立したコマンドなので、後にテキストが続く必要があります。次の行に。したがって、次の行を終了する必要があります。。あなたはすでにそれを得ました\。ただ忘れてしまったようですn

printf '/^PermitRootLogin/\nc\NPermitRootLogin いいえ\n。 \nw\nq\n' | ed -s /etc/ssh/sshd_config

答え3

  1. 設定ファイルに表示されないランダムな文字列を選択します。/、、.など*[特殊文字は使用しないことをお勧めします]。たとえばを使用します<G-Man>
  2. 以下を行います。

    ed -s /etc/ssh/sshd_config << EOF
            g/^#*PermitRootLogin/s/^/<G-Man>/
            g/^<G-Man>##*PermitRootLogin...../s/<G-Man>//
            1,$s/^<G-Man>\(#*PermitRootLogin\).*/\1 no/
            w
            q
    EOF
    
  3. これは何をしますか?

    すべての行を探す

    • PermitRootLogin始まる
    • 1つ以上の#文字で始まり、その後にPermitRootLogin最大4つの異なる文字が続きます。

    に変更し、PermitRootLogin no行の#先頭の文字をそのままにします。

  4. ああ?何?なぜこのようなことをするのですか?

    目標は、次の行のいずれかを変更することです。

    PermitRootLogin yes
    PermitRootLogin no
    PermitRootLogin The quick brown fox jumps over the lazy dog.
    #PermitRootLogin yes
    #PermitRootLogin no
    

    しかし、次の行ではありません。

    #In this section we set
    #PermitRootLogin to “maybe”,
    #because we haven’t decided yet.
    

    このデザインには、次のような不幸な副作用がある可能性があります。

    ##PermitRootLogin yes
    ##PermitRootLogin ???
    

    〜する変更して次の行を追加します。

            PermitRootLogin yes
    # PermitRootLogin yes
            #PermitRootLogin yes
    

    しないでしょう。

  5. どのように動作しますか?
    • g/^#*PermitRootLogin/s/^/<G-Man>/PermitRootLoginで始まる、または#直後に1つ以上の文字で始まるすべての行を見つけ、文字列としてPermitRootLogin「表示」します<G-Man>(行の先頭に挿入)。PermitRootLogin文字の前後にスペース(または他のもの)がない場合は、コメント化された行に影響を与えます。#
    • g/^<G-Man>##*PermitRootLogin...../s/<G-Man>// ラベル付きのすべての行を検索最後のもの #始めに5文字以上の文字が来てPermitRootLoginタグを削除してください。PermitRootLogin長さを超えるコメント行の表示が解除されます yes。 (もちろん数量を変更できます。.やる意思があれば。 )
    • 1,$s/^<G-Man>\(#*PermitRootLogin\).*/\1 no/ まだマーカーがあるすべての行を見つけて、マーカーを削除し、PermitRootLoginすべての古い#文字をキャプチャして保持し、残りの行を no
  6. もちろん、printf必要に応じてこれらのコマンドをaに縮小することもできます。

関連情報