텍스트 처리: 파일의 일부를 추출하여 한 줄에 씁니다.

텍스트 처리: 파일의 일부를 추출하여 한 줄에 씁니다.

다음 형식의 파일이 여러 개 있습니다.

...
<title> Field1 : DATA_FIELD_1</title>
...
<i class="blablabla"></i> <b>Field2 : </b> <span>DATA_FIELD_2</span>
...
<i class="blablabla"></i> <b>Field3 : </b> <span>DATA_FIELD_3</span>
...
<i class="blablabla"></i> <b>Field4 : </b> <span>DATA_FIELD_4</span >
...
<i class="blablabla"></i> <b>Field5 : </b> <span>DATA_FIELD_5 </span>
...

각 파일을 읽고 각 필드의 데이터를 가져온 다음 파이프로 구분된 형식으로 새 파일에 쓰고 싶습니다.

예를 들어:

FileID | Field1 | Field2 | Field3 | Field4 | Field5
1 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5
2 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5
3 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5
4 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5

다음 명령을 사용하여 grep으로 데이터를 추출했습니다.

grep -o 'Field1 : .*\|Field2 : .*\|Field3 : .*\|Field4 : .*\|Field5 : .*' File-* >> NewFile

하지만 이것이 내가 얻은 결과입니다

File-1:Field1 : DATA_FIELD_1</title>
File-1:Field2 : </b> <span>DATA_FIELD_2</span>
File-1:Field3 : </b> <span>DATA_FIELD_3</span>
File-1:Field4 : </b> <span>DATA_FIELD_4</span >
File-1:Field5 : </b> <span>DATA_FIELD_5 </span>
File-2:Field1 : DATA_FIELD_1</title>
File-2:Field2 : </b> <span>DATA_FIELD_2</span>
File-2:Field3 : </b> <span>DATA_FIELD_3</span>
File-2:Field4 : </b> <span>DATA_FIELD_4</span >
File-2:Field5 : </b> <span>DATA_FIELD_5 </span>
File-3:Field1 : DATA_FIELD_1</title>
File-3:Field2 : </b> <span>DATA_FIELD_2</span>
File-3:Field3 : </b> <span>DATA_FIELD_3</span>
File-3:Field4 : </b> <span>DATA_FIELD_4</span >
File-3:Field5 : </b> <span>DATA_FIELD_5 </span>

답변1

또 다른 가능한 접근 방식은 XML 프로세서를 사용하는 것입니다. 이 경우 XMLstarlet.

xmlstarlet sel -t -v 'substring-after(//title,":")' \
                  -m //span -o "|" -v .  \
               -t -n  *.xml

어디:

  • sel -t-- 다음 템플릿을 기반으로 XML 부분을 선택합니다.
  • -v 'substring-after(//title,":")'-- ":" 뒤의 제목 값입니다.
  • -m //span -o "|" -v . -- span"|"와 해당 값을 일치시켜 인쇄합니다.
  • -t -n-- 개행 문자 추가

답변2

일반적으로 정규식을 사용하여 HTML/XML을 처리하는 것은 모든 특수한 경우를 처리할 만큼 표현력이 충분하지 않기 때문에 좋은 생각이 아닙니다. 그러나 귀하의 grep 출력은 귀하의 특정한 경우에 그렇게 할 수 있음을 시사합니다.

sed를 사용하여 grep 명령의 출력을 처리하는 방법은 다음과 같습니다.

sed -e 'N;N;N;N;s/^File-\(.*\):Field1 : \(.*\)<\/title>.*Field2 : .*<span>\(.*\)<\/span *>.*Field3 : .*<span>\(.*\)<\/span *>.*Field4 : .*<span>\(.*\)<\/span *>.*Field5 : .*<span>\(.*\)\s*<\/span *>/\1 | \2 | \3 | \4 | \5 | \6/'

설명하다:

  • N;N;N;N;: 이는 5행을 5행으로 연결하는 데 사용됩니다(파일의 모든 필드를 같은 행에 배치하기 위해).
  • s/: 교체 명령이 시작됩니다. 첫 번째 부분은 일치하고 두 번째 부분은 교체됩니다.
  • ^File-\(.*\):: 파일번호와 일치합니다.
  • Field1 : \(.*\)<\/title>: 첫 번째 필드와 일치합니다.
  • .*Field2 : .*<span>\(.*\)<\/span *>: 두 번째와 일치합니다.
  • ...
  • /\1 | \2 | \3 / \4 | \5 | \6/:대체 부분입니다. \(.*\)첫 번째 부분에서 으로 구분된 각 그룹은 특수 변수 등을 통해 캡처되고 재사용 가능합니다 \1.\2

결과:

1 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5 
2 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5 
3 | DATA_FIELD_1 | DATA_FIELD_2 | DATA_FIELD_3 | DATA_FIELD_4 | DATA_FIELD_5

관련 정보