sed를 사용하여 하이픈 제거

sed를 사용하여 하이픈 제거

일부 페이지 나누기에 하이픈이 포함된 간단한 XML 파일이 있습니다. 입력은 이렇습니다

 ba bla bla hyphe-</page>
 <page>nated bla bla bla

출력은 다음과 같아야합니다

 bla bla bla</page>
 <page>hyphenated bla bla bla

나는 sed 명령에 대해 알고 있지만 N하이픈이 홀수 줄에 나타날지 짝수 줄에 나타날지 제어할 수 없습니다.

위의 스케치에 따라 sed를 사용하여 하이픈을 제거할 수 있나요? 대안이 있습니까(예: 다른 UNIX 셸 명령 사용, Python 또는 Perl 사용)?

편집하다. 요청한 대로 내 입력 파일의 실제 예는 다음과 같습니다.

[...] and vapours, upon the comparison of the air-thermo-</page>
<page>meter with the mercurial thermometer, upon the elastic [...]

편집 2: 이 예제를 무작위로 선택했지만 정말 짜증나는 예제입니다. 이 경우 원하는 출력은 다음과 같습니다.

 [...] and vapours, upon the comparison of the</page>
<page>air-thermometer with the mercurial thermometer, upon the elastic [...]

즉, 단어 구분 기호로 공백을 사용합니다. 나에게 가장 큰 문제는 원시 개행 문자에 걸쳐 있는 패턴을 작성하는 것입니다. 예, 패턴은 앞의 하이픈만 제거해야 합니다.</page>

답변1

Perl의 Oneliner (terdon에게 감사드립니다!):

perl -0 -pe 's/\s+(\S+)-(<\/page>\s+<page>)(\S+)/$2$1$3/g' filename

기능: 정규식과 일치하고 일치하는 부분을 사용하여 단어를 재구성합니다.

답변2

일종의 괴물) Perl을 사용하는 것이 더 쉬울 것입니다

cat file
ba bla bla hyphe-</page>
<page>nated bla bla bla
and the output should look like

bla bla bla</page>
<page>hyphenated bla bla bla

GNU sed입니다(확장 정규 표현식을 위해 다른 sed -s -E 옵션과 함께 사용됨)

sed -nr '/[[:alpha:]]+-<\/[[:alpha:]]+>$/{
N
s!([[:alpha:]]+)-(</[[:alpha:]]+>)\n(<[[:alpha:]]+>)([[:alpha:]]+)!\2\n\3\1\4!}
p' file
ba bla bla </page>
<page>hyphenated bla bla bla
and the output should look like

bla bla bla</page>
<page>hyphenated bla bla bla

관련 정보