sed를 사용하여 \n을 2가지 패턴(패턴 제외) 사이에서 |으로 변경하고 싶습니다.
일련의 주소가 여러 번 포함된 파일이 있습니다.
Adress:
1540 Broadway
New York
NY 10036
United-states
###
난 갖길 원해:
Adress:1540 Broadway|New York|NY 10036|United-states
###
다음 코드 줄을 사용합니다.
sed -i "/^Adress:/!b;:a;/###/bb;$!{N;ba};:b;s/\n/\|/g;tb" file.txt
...하지만 두 가지 모드가 모두 포함되어 있는데 다음과 같은 잘못된 결과가 나타납니다.
Adress:|1540 Broadway|New York|NY 10036|United-states|###
대안에서 패턴을 제외하려면 어떻게 변경해야 합니까?
답변1
작은 문제를 처리하는 경우가 아니면 이러한 종류의 작업을 수행하기 위해 루프를 사용하지 않는 것이 좋습니다. 줄 번호 1. 범위와 예약된 공간을 사용하는 것이 더 좋습니다.
sed '/Address/,/###/{
/###/!H;/Address/h;/###/!d;x;s/\n//;s/\n/|/g;G
}' infile
즉, 범위의 각 행에 대해 다음을 수행합니다. 범위의 마지막 행이 아닌 경우 예약된 공간에 추가하고(범위의 첫 번째 행인 경우 덮어쓰기) 행을 삭제하고, 그렇지 않으면 버퍼를 교체합니다. 영역에서 첫 번째 포함된 개행 문자를 제거하고 나머지를 로 대체합니다 |
. 그런 다음 보유 버퍼 내용이 패턴 공간에 추가됩니다.
마지막 항목을 Address
따르지 않으면 실패하므로 ###
이를 방지하려면 두 번째 조건을 사용하고 입력의 마지막 줄이 아닌 경우에만 삭제하고, 그렇지 않으면 저장 버퍼에 추가하고 교환하고 종료합니다.
sed '/Address/,/###/{
/###/!H;/Address/h;/###/!{
$!d;H;x;q
}
x;s/\n//;s/\n/|/g;G
}' infile
1: 끌어와야 하는 선이 많을수록 패턴 공간이 일치하는지 지속적으로 확인해야 하기 때문에 속도가 느려집니다.결과는 여기(이것은 다른 요구 사항이라는 것을 알고 있지만 단지 아이디어를 제공하기 위한 것입니다...)