一致する文字列からn行目を削除します(ファイル内で一度だけ発生します)。

一致する文字列からn行目を削除します(ファイル内で一度だけ発生します)。

複数のファイルで使用されているn+2場所から一致文字列の後に表示される文字列を削除することに関連する問題があります。以下を使用して印刷できます。nawk

 awk -F '/radius-server/{nr[NR+4]}; NR in nr' *

一致する文字列がどこにあるかradius-serverわかりません。 awk誰か助けてくれてありがとう。この行を所定の位置から削除してください。これは、削除が完了した後にファイルを変更して保存したいという意味です。以下は、file 1変更されていない例のシナリオです。

 radius-server dz7HQQH4EqT5 1645-1646
 !
 oj5icqh1dGpSK
 !  
 alias exec t telnet
 alias exec sis show interface status
 !

file 2、修正済み——

radius-server dz7HQQH4EqT5 1645-1646
!
!
alias exec t telnet
alias exec sis show interface status
!

パターンマッチング方法を使用して削除できることはわかっていますが、sed -i '/pattern/d'値がファイルごとに変更されるため、これは私が望むものではありません。どんな助けでも大変感謝します。

答え1

sedが適切なツールのようです。

sed -i '/radius-server/!b;n;n;d' filename

仕組み:

/radius-server/!b # as long as it's NOT 'radius-server' do nothing (branch to end)
n # read next line (replace current line with next line)
n # same as above - we now read 2 lines
d # delete the current line

更新 - 複数のファイルを変更するには、ファイル名の代わりにglobを使用してください。例:

sed -i '/radius-server/!b;n;n;d' *

答え2

GNU awk 4.1.0以上がない場合...

-ised オプションのようなオプションがないので、次のようにします。

*にあるファイルの場合
する
awk -v line=2 'BEGIN { 無視 = -1 } /radius-server/ { 無視 = NR + line } NR != 無視 { 印刷 }' "$file"
完了>結果.txt

仕組みは次のとおりです。

BEGIN { ignore = -1 }             # initialize ignore with -1 so NR will never
                                  # be equal to it by accident

/radius-server/ { ignore = NR + lines } # when the radius-server is found, set ignore to the
                                  # line we want to ignore

NR != ignore { print }            # unless the current line is that line, print
                                  # it.

注:これは-i魔法ではなく、一時ファイルを作成してsed処理することもあります。

修正する

サブディレクトリに再帰的に入る必要がある場合:

探す。 -type f -exec awk ... {}>結果。txt

どちらの場合も、result.txtを異なるディレクトリに配置する必要があります。それ以外の場合は、一致して入力ファイルとして使用されます。

答え3

PATH_TO_FOLDER="/some/path/to/folder/"
FILE_EXTENSION=".ext"
FILES=$(ls ${PATH_TO_FOLDER}/*${FILE_EXTENSION})

for FILE in $FILES; do
FILENAME=$(basename $FILE ${FILE_EXTENSION})
TMP_FILE=${PATH_TO_FOLDER}/${FILENAME}.tmp
awk -v Lines=2 '{if($0~"radius-server"){ 
print;
for(i=0;i<=Lines;i++)
{
getline;
if(i==Lines){
next;
}else{
print; 
}
} 
}
else{
print;
}
}' $FILE > $TMP_FILE
mv ${TMP_FILE} ${FILE}

原則として、これはうまくいきます。デフォルトでは、行に含まれている場合、radius-serverはその行を印刷してから3行を繰り返します。 0は最初の行を印刷し、1は2行目を印刷し、3は3行目を完全にスキップします。他のすべての場合、行はそのまま印刷されます。

関連情報