다음 형식의 파일이 여러 개 있습니다.
...
<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