일치하는 문자열에서 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은 두 번째 줄을 인쇄한 다음 3은 세 번째 줄을 완전히 건너뜁니다. 다른 모든 경우에는 줄이 그대로 인쇄됩니다.

관련 정보