첫 줄이 다음으로 시작하는 파일이 있습니다.<?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개의 문자와 일치하는 것과 \?
동일한 의미를 갖는 특수 문자로 처리합니다.?
따라서 <\?xml
0 또는 1 <
다음에 xml
, match 가 오는 것을 의미합니다 <?xml
.BRE의 경우 ^
, $
, *
및 만 특수 문자 입니다 .
.\
[
이므로 텍스트를 일치시키려면 다른 모든 문자를 변경하지 않고 유지하세요.
sed -e '/^<?xml/d' <file
리터럴 문자열과 일치시키기 위해 이스케이프 시퀀스를 계속 사용하려면 활성화하십시오.확장 정규식(이것은다음 버전에서는 POSIX 표준이 됩니다.):
sed -E '/^\?xml/d' <file
( sed -E
BSD sed와 함께 사용)
답변3
첫 줄이 [...]로 시작하는 파일이 있는데 줄의 시작 부분이 일치하지 않는지
<?xml
확인하려고 하면/^<\?xml/d
텍스트 앞에는 다음이 포함될 수 있습니다.BOM(바이트 순서 표시). 이는 UTF-16 형식 파일(특히 Windows 시스템의 파일)에서 일반적이며 다음을 나타내는 데 사용됩니다.바이트 순서16비트 문자를 포함하는 파일의 바이트 수입니다.
많은 16진수 덤프 도구( hex
, hexdump
, 3개를 나타냄) 중 하나를 사용하고 처음 몇 문자를 보면 od -c
이를 확인할 수 있습니다. 처음 두 문자로 FF FE
또는 가 표시되면 FE FF
BOM입니다.
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 ...