다음과 같은 두 줄을 sed로 바꾸려고합니다.
sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/\1 \2/}'
답변에서 이 구문을 얻었습니다.여기, 패턴의 첫 번째 줄을 먼저 일치시킨 다음 N
교체를 위해 패턴 공간에 다음 줄을 추가한다고 설명합니다. 이전에는 이것이 나에게 효과적이었지만 이번에는 가장 이상한 일이 일어났습니다.
입력의 경우:
user-type: admin
password minumim length: 8
user-type: auth
password minumim length: 8
나는 얻다:
8min
8th
내가 예상했을 때 :
admin 8
auth 8
두 번째로 저장된 일치 항목이 줄의 시작 부분부터 인쇄되어 이전에 인쇄된 내용을 대체하는 것처럼 보입니다.
어떤 아이디어가 있나요?
답변1
귀하의 명령이 저에게 효과적입니다.
$ sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/\1 \2/}' file.txt
admin 8
auth 8
그러나 입력을 DOS 형식으로 변환하면 다음과 같은 출력이 표시됩니다.
$ sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/\1 \2/}' <(sed 's/$/\r/' <file.txt)
8min
8th
한 가지 해결책은 입력 파일을 UNIX 스타일 줄 끝으로 변환하는 것입니다.
또 다른 해결책은 문자를 허용하도록 sed 명령을 조정하는 것입니다 \r
.
$ sed -r '/user-type/{N;s/user-type: (.*)\n.*gth: .*([0-9]+).*$/\1 \2/; s/\r//}' <(sed 's/$/\r/' <file.txt)
admin 8
auth 8
또는:
$ sed -r '/user-type/{N;s/user-type: ([^\r]*).?\n.*gth: .*([0-9]+).*$/\1 \2/}' <(sed 's/$/\r/' <file.txt)
admin 8
auth 8