Sed 또는 Perl을 사용하여 개행 문자를 제거하는 방법

Sed 또는 Perl을 사용하여 개행 문자를 제거하는 방법

다음 줄을 포함하는 거대한 XML 데이터 파일이 있습니다.

<fonts> some of the data </fonts>
<fonts> some of the data </fonts>
<fonts> some of
 the data </fonts>
<fonts> some of the data </fonts>
<fonts> some of the data </fonts>

그 사이에 개행문자가 옵니다...

$>uname -a
SunOS ******* 5.11 SunOS_Development

답변1

XML 파일이 주어지면 file.xml:

<?xml version="1.0"?>
<root>
  <fonts> some of the data </fonts>
  <fonts> some of the data </fonts>
  <fonts> some of
the data </fonts>
  <fonts> some of the data </fonts>
  <fonts> some of the data </fonts>
</root>

normalize-spacesXMLStarlet을 사용하여 모든 노드에 XPath 기능을 적용할 수 있습니다 .fonts

$ xmlstarlet ed -u '//fonts' -x 'normalize-space()' file.xml
<?xml version="1.0"?>
<root>
  <fonts>some of the data</fonts>
  <fonts>some of the data</fonts>
  <fonts>some of the data</fonts>
  <fonts>some of the data</fonts>
  <fonts>some of the data</fonts>
</root>

fonts이렇게 하면 측면 공간이 제거되고 모든 노드의 다른 모든 유형의 공간이 단일 공간으로 대체됩니다.

삭제만 하시겠습니까?개행 문자fonts노드 의 데이터:

$ xmlstarlet ed -u '//fonts' -x 'translate(., "'$'\n''", "")' file.xml
<?xml version="1.0"?>
<root>
  <fonts> some of the data </fonts>
  <fonts> some of the data </fonts>
  <fonts> some of the data </fonts>
  <fonts> some of the data </fonts>
  <fonts> some of the data </fonts>
</root>

$'\n'이는 리터럴 줄 바꿈으로 확장되는 쉘에 의존합니다 .

답변2

표준 방법은 tr 명령입니다. 공백은 실제로 XML 사양의 일부가 아니기 때문에 XML에는 매우 긴 줄이 있을 수 있으며 일반적으로 그렇습니다. 대부분의 Unix 텍스트 명령은 줄 기반이며 긴 줄은 sed 또는 awk(Linux에서 성능이 크게 저하되는 경향이 있음)와 같은 명령을 손상시킬 수 있습니다. tr은 행에 대해 전혀 신경 쓸 필요가 없으므로 이 데이터를 잘 처리합니다.

tr -d '[\r\n]' <inFile > outFile

그러나 분할된 것처럼 보이는 세 번째 "글꼴" 줄이 걱정됩니다. 해당 줄 바꿈을 제거하면 텍스트가 공백 없이 함께 실행됩니다. 셀에 여러 줄의 텍스트가 있는 경우 Excel .xlsx 파일이 줄 바꿈(및 캐리지 리턴)을 사용한다는 것을 알고 있습니다.

공백을 제거해야 하는 이유는 무엇입니까? 아무런 문제가 발생하지 않아야 합니다. 사실 저는 보통 "xmllint --format"을 통해 XML을 실행합니다. 이렇게 하면 편집기에서 XML을 볼 수 있습니다. Excel에서 다시 잘 읽힙니다. XML을 보기 좋게 인쇄하고 Excel로 가져온 다음 긴 행으로 다시 쓰고 cksum을 수행했는데 결과는 동일했습니다.

RS = ">"를 정의하여 awk에서 긴 줄 문제를 피할 수 있습니다. XML에는 지나치게 긴 줄을 피하기 위해 항상 충분한 >가 있습니다. 그런 다음 awk는 최대 하나의 텍스트 항목 앞에 오는 별도의 줄에서 각 XML 엔터티를 봅니다. 실제 개행 문자가 있으면 텍스트에 그대로 남아 있으므로 세 번째 입력이 다음과 같이 표시됩니다.

<fonts>
some of\nthe data</fonts>

그런 다음 각 NL 또는 CR/LF를 공백으로 바꾸고 문구를 보존할 수 있습니다.

더 자세한 코드가 필요하면 문의하세요.

Excel이 XML과 어떤 관련이 있는지 궁금하신 경우: Excel 파일(.xls가 아닌 .xlsx, .xlsm 등)은 20개 이상의 XML 파일로 구성된 zip 묶음일 뿐입니다.

답변3

sed 's/\n/ /g'를 사용할 수 있습니다. 두 번째 슬래시 뒤의 공백에 유의하세요. 위의 표현식은 모든 줄 바꿈을 공백으로 바꿉니다.

답변4

우리를할 수 없다사용sed s'/\n/ /g'

sed는 개행으로 구분된 텍스트와 함께 작동합니다. 각 입력 항목이 표현식을 통해 실행될 때 개행 문자가 제거되므로 표현식이 일치하지 않습니다. 정의에 따르면 줄 중간에는 개행 문자를 얻을 수 없습니다. (테스트되었습니다.)

awk에서는 RS '줄 끝' 문자를 전환하여 다른 문자가 사용되고 개행 문자가 유지되도록 할 수 있습니다. 또는 (gawk에서) RS를 지우면 전체 파일이 하나의 긴 줄로 나타납니다. 이 작업을 수행할 수 있는 다른 표준 명령은 생각할 수 없습니다.

sed에서 줄바꿈을 처리하려면 공간 보존을 사용하고 끝/시작 조건이 일치하는 방식(예: 텍스트, 레이블이 텍스트를 따르는 등)에 따라 다음 줄에 연결하는 방법을 알아내야 합니다.

또한 OP는 SunOS 5.11에서 실행되고 있는데 줄 길이 제한은 2048자입니다. 따라서 일반 XML은 이를 깨뜨릴 것입니다. Solaris awk는 6144(6K)자에서 중단됩니다.

이 파일이 올바른 XML인지 확실하지 않습니다. OP는 필수(누락, 죽은 것으로 추정) 태그를 거부했기 때문에 다른 홈브류 문제가 숨어 있을 수 있습니다.

관련 정보