CentOS 7.2의 명령줄에서 텍스트 파일의 모든 텍스트 문자열을 바꾸고 싶습니다.
Search-string: ).\nPORT
Replacement-string: ). \n0 closed ports\nPORT
나는 이것을 다른 도구(예: ,,, ... )를 사용하여 달성할 수 있지만 sed
이를 수행하고 명령을 이해할 수 있는 쉬운 방법을 찾을 수 없습니다(중요 ;-)). 나에게 가장 큰 문제는 줄바꿈입니다. 줄바꿈이 없어도 괜찮습니다.awk
tr
sed
설명이 포함된 제안은 매우 환영합니다.
편집됨
입력하다
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00090s latency).
PORT STATE SERVICE
21/tcp open ftp
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00079s latency).
Not shown: 2 closed ports
PORT STATE SERVICE
22/tcp open ssh
|_banner: SSH-2.0-mpSSH_0.2.1
...
산출
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00090s latency).
0 closed ports
PORT STATE SERVICE
21/tcp open ftp
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00079s latency).
Not shown: 2 closed ports
PORT STATE SERVICE
22/tcp open ssh
|_banner: SSH-2.0-mpSSH_0.2.1
...
답변1
가능한 접근방식입니다
sed '/)\. $/ {
n
/^PORT/ i\
0 closed ports
}'
시험
$ sed '/)\. $/ {
n
/^PORT/ i\
0 closed ports
}' < input
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00090s latency).
0 closed ports
PORT STATE SERVICE
21/tcp open ftp
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00079s latency).
Not shown: 2 closed ports
PORT STATE SERVICE
22/tcp open ssh
|_banner: SSH-2.0-mpSSH_0.2.1
...
답변2
N
sed를 사용하여 패턴 공간에서 다음 입력 줄을 추출한 다음 두 줄을 동시에 처리할 수 있습니다 .
예를 들어, 표시된 경우 다음 행을 조건부로 가져온 foo
다음 두 행을 모두 교체합니다. (연속 행이 foo
이를 깨뜨립니다.)
echo -e "asf\nfoo\nbar" | sed -e '/foo/N;s/o\nb/od\nc/'
또한 GNU sed에는 -z
줄 바꿈 대신 NUL 문자에서 "줄"을 구분하는 옵션이 있습니다. 이렇게 하면 줄 바꿈에 걸쳐 있는 패턴을 쉽게 일치시킬 수 있지만 전체 입력에 대해 문자열 작업이 한 번에 실행되어 큰 입력에서는 문제가 될 수 있습니다.
물론 주변 구조도 고려해야 합니다. 편집을 진행하는 최선의 방법에 영향을 미칠 수 있기 때문입니다.
답변3
GNU sed의 새 버전은 -z 옵션을 지원합니다.
일반적으로 sed는 줄 끝 문자(개행 또는 캐리지 리턴)까지 문자열을 읽어서 줄을 읽습니다.
버전 4.2.2의 GNU 버전 sed에는 "NULL" 문자를 대신 사용하는 기능이 추가되었습니다. 이는 레코드 구분 기호로 NULL을 사용하는 파일이 있는 경우 유용합니다. 일부 GNU 유틸리티는 "find . -print0" 또는 "grep -lZ"와 같이 새 줄 대신 NULL을 사용하는 출력을 생성할 수 있습니다.
이 옵션은 sed가 다른 라인에서 작동하도록 하려는 경우에 사용할 수 있습니다.
sed -z 's/)[.]\nPORT/). \n0 closed ports\nPORT/g' inputfile
예제 입력 뒤에는 공백이 있습니다.(0.00090s latency).