
複数のファイルで使用されているn+2
場所から一致文字列の後に表示される文字列を削除することに関連する問題があります。以下を使用して印刷できます。n
awk
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以上がない場合...
-i
sed オプションのようなオプションがないので、次のようにします。
*にあるファイルの場合 する 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行目を完全にスキップします。他のすべての場合、行はそのまま印刷されます。