..png)
여러 파일 에 사용되는 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은 두 번째 줄을 인쇄한 다음 3은 세 번째 줄을 완전히 건너뜁니다. 다른 모든 경우에는 줄이 그대로 인쇄됩니다.