シェルコマンドがあります。
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
- 設定ファイルに表示されないランダムな文字列を選択します。
/
、、.
など*
の[
特殊文字は使用しないことをお勧めします]
。たとえばを使用します<G-Man>
。 以下を行います。
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
これは何をしますか?
すべての行を探す
- で
PermitRootLogin
始まる - 1つ以上の
#
文字で始まり、その後にPermitRootLogin
最大4つの異なる文字が続きます。
に変更し、
PermitRootLogin no
行の#
先頭の文字をそのままにします。- で
ああ?何?なぜこのようなことをするのですか?
目標は、次の行のいずれかを変更することです。
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
しないでしょう。
- どのように動作しますか?
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
。
- もちろん、
printf
必要に応じてこれらのコマンドをaに縮小することもできます。