0

文字列をgrepするときに、ファイルの最初の文字を削除したい。ただし、編集前に変更された行が同じ位置にある必要があります。

サンプルファイル:

#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
auth            include         system-auth
account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet

編集後の予想ビュー:

#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
auth           sufficient      pam_wheel.so trust use_uid
auth            include         system-auth
account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet

その場合、4行目で「#」を削除するだけで済みますが、編集したい正確な行を指すときではなく、文字列「sufficient pam_wheel.so trust use_uid」を検索するときにそれを行いたいです。

4

5 に答える 5

4

これは の仕事ですsed:

$ sed -r 's/^#(.*sufficient\s+pam_wheel\.so trust use_uid.*)/\1/' file
#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
auth           sufficient      pam_wheel.so trust use_uid
auth            include         system-auth
account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet

再説明:

s/                            # Substitute  
^#                            # A line starting with a #
(                             # Start capture group
.*                            # Followed by anything
sufficient                    # Followed by the word sufficient
\s+                           # Followed by whitespace
pam_wheel\.so trust use_uid   # Followed by the literal string (escaped .)
.*                            # Followed by anything
)                             # Stop capture group
/                             # Replace with 
\1                            # The first capture group 

したがって、効果的に#、文字列を含む行から始まりsufficient\s+pam_wheel.so trust use_uid#

注:フラグは拡張正規表現用です。お使いのバージョンの-rフラグである可能性があるため、.-Esedman

変更を元に戻したい場合は、次のオプションをfile使用します。-i

$ sed -ri 's/^#(.*sufficient\s+pam_wheel\.so trust use_uid.*)/\1/' file

列の配置が重要な場合は、sufficientそれ以降をキャプチャして、2 つのキャプチャ グループを取得し、 に置き換え\1 \2ます。

$ sed -r 's/^#(.*)(sufficient\s+pam_wheel\.so trust use_uid.*)/\1 \2/' file
#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
auth            sufficient      pam_wheel.so trust use_uid
auth            include         system-auth
account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet

編集:

AllowUsers support admin文字列を#AllowUsers support admin次のように置き換えます。

$ sed -r 's/^(AllowUsers support admin.*)/#\1/' file
#AllowUsers support admin

$ sed -r 's/^(DeniedUsers root.*)/#\1/' file
#DeniedUsers root
于 2012-12-10T10:46:30.420 に答える
1
perl -pi -e '$_=~s/^.//g if(/sufficient      pam_wheel.so trust use_uid/)' your_file

注: これは inplace replacement.so を実行するため、コマンドを実行した後、ファイルは自動的に変更されます。

于 2012-12-10T12:34:21.177 に答える
0

awkを使用すると、次のことができます。

awk -F '#' '{ if ($0 ~ /^#.*sufficient +pam_wheel.so trust use_uid/) {$1=""; print;} else print}'  infile

または(最初に#が1つしかない場合):

awk -F '#' '{ if ($0 ~ /^#.*sufficient +pam_wheel.so trust use_uid/) print $2; else print}'  infile
于 2012-12-10T10:59:30.533 に答える
0

sed コマンドは、文字列比較ではなく RE 一致のみを実行できるため、sed を使用するには、目的の文字列を解析して、エラーが発生しやすいすべての RE メタ文字をエスケープする必要があります (たとえば、現在投稿されているソリューションはすべて、「.」のエスケープを無視していますpam_wheel.so)。

文字列を照合しようとしているときは、文字列比較を行うほうがよいです。たとえば、次のようになります。

awk 'index($0,"sufficient pam_wheel.so trust use_uid"){sub/^#/,"")}1' file > tmp && mv tmp file
于 2012-12-10T13:55:46.103 に答える
0

を使用する 1 つの方法を次に示しsedます。

sed '/sufficient \+pam_wheel.so \+trust \+use_uid/s/^#//' file

結果:

#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
auth           sufficient      pam_wheel.so trust use_uid
auth            include         system-auth
account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet
于 2012-12-10T11:09:36.303 に答える