제거 방법

제거 방법

첫 줄이 다음으로 시작하는 파일이 있습니다.<?xml

sed를 사용하여 제거할 수 있습니다.

/<\?xml/d

하지만 줄이 시작되는지 확인하려고 하면 -

/^<\?xml/d

일치하지 않습니다.
그러나 다른 라인, 예를 들어

<head ...

삭제되었습니다

/^<head/d

나도 시도했다

/^\<\?xml/d

하지만 일치하는 항목이 없습니다.

답변1

사용:

sed '/^<?xml/d' filename

GNU sed에서는 \?앞의 문자 중 0개 또는 1개를 나타냅니다. (POSIX sed에서는 \?정의되지 않았습니다.) 리터럴을 일치시키려면 ?이스케이프하지 마십시오.

이 테스트 파일을 고려해 보겠습니다.

$ cat filename
<?xml deleteme
<.xml keepme
..xml keepme

위의 솔루션은 원하는 결과를 가져왔습니다.

$ sed '/^<?xml/d' filename
<.xml keepme
..xml keepme

질문의 첫 번째 명령은 결과를 잘못 생성합니다.

$ sed '/<\?xml/d' filename
$

이는 xml선택적 선행 을 포함하는 모든 행 과 일치하기 때문입니다 <. 모든 행이 포함되어 있으므로 xml모두 삭제됩니다.

두 번째 명령은 아무것도 삭제하지 않습니다.

$ sed '/^<\?xml/d' filename
<?xml deleteme
<.xml keepme
..xml keepme

<이렇게 하면 0 또는 1로 시작하는 모든 줄이 제거됩니다.통과 xml. 줄에는 <항상 과 사이에 문자가 하나 이상 있으므로 xml줄이 삭제되지 않습니다.

의심스러울 때 문자를 탈출하는 방법

문자가 정규식 활성인지 확실하지 않고 비활성화하려는 경우 대괄호 안에 넣는 것이 안전합니다.

$ sed '/^[<][?]xml/d' filename
<.xml keepme
..xml keepme

내부적으로 [...]모든 문자는 리터럴 문자로 처리됩니다.

답변2

POSIX에서는기본 정규식, 그 동작은 \?정의되지 않았습니다(GNU sed의 다른 이스케이프 시퀀스는 등 입니다 \|.\+여기).

GNU sed는 기본적으로 BRE를 사용하는데, 이는 이러한 이스케이프 시퀀스를 0개 또는 1개의 문자와 일치하는 것과 \?동일한 의미를 갖는 특수 문자로 처리합니다.?

따라서 <\?xml0 또는 1 <다음에 xml, match 가 오는 것을 의미합니다 <?xml.BRE의 경우 ^, $, *및 만 특수 문자 입니다 ..\[이므로 텍스트를 일치시키려면 다른 모든 문자를 변경하지 않고 유지하세요.

sed -e '/^<?xml/d' <file

리터럴 문자열과 일치시키기 위해 이스케이프 시퀀스를 계속 사용하려면 활성화하십시오.확장 정규식(이것은다음 버전에서는 POSIX 표준이 됩니다.):

sed -E '/^\?xml/d' <file

( sed -EBSD sed와 함께 사용)

답변3

첫 줄이 [...]로 시작하는 파일이 있는데 줄의 시작 부분이 일치하지 않는지 <?xml 확인하려고 하면/^<\?xml/d

텍스트 앞에는 다음이 포함될 수 있습니다.BOM(바이트 순서 표시). 이는 UTF-16 형식 파일(특히 Windows 시스템의 파일)에서 일반적이며 다음을 나타내는 데 사용됩니다.바이트 순서16비트 문자를 포함하는 파일의 바이트 수입니다.

많은 16진수 덤프 도구( hex, hexdump, 3개를 나타냄) 중 하나를 사용하고 처음 몇 문자를 보면 od -c이를 확인할 수 있습니다. 처음 두 문자로 FF FE또는 가 표시되면 FE FFBOM입니다.

BOM을 유지하는 것이 더 나을 수 있으므로 RE에서 출발선 요구 사항을 간단히 제거하면 솔루션이 가장 잘 달성됩니다.

그런데, XML 파일에서 데이터를 추출하려는 경우 일반적으로 RE로 데이터를 마이닝하는 것보다 적절하게 구문 분석하는 것이 더 좋습니다. (물론 예외도 있지만 파일, 주석 구조 등의 예상치 못한 효과적인 재형식화를 허용하는 일반적인 경우에 대해 이야기하고 있습니다.)

답변4

이것이 xml 변환의 결과인 경우( xsltprox foo.xsl bar.xml예를 들어) xml 줄은 첫 번째 줄에만 있습니다.

다음 방법 중 하나를 사용하십시오.

awk 'NR>1' 

파이프라인에 있는 경우 다음 중 하나를 수행합니다.

awk 'FNR>1' file1 file2 ... > result

파일이 여러 개 있습니다.

 sed -i -e 1d file1 file2 ...

관련 정보