sed
XML 파일에 "정규식 사용"을 적용하려고 할 때 누구든지 나를 도울 수 있는지 궁금합니다 . 나는 이 접근 방식이 본질적으로 유사하다고 생각합니다.
sed
다음 파일에 명령을 사용하고 싶습니다 .
ABC
12345
54321
98765
56789
DEFG
07418
8529
BBBG
12365
9879
8596
7485
NMKL
3652
4523
12345 192.168.1.12
54321 10.10.2.23
98765 192.168.2.52
56789 172.16.2.2
07418 192.168.11.56
8529 10.11.3.55
9879 10.17.25.12
8596 192.168.7.23
7485
3652 172.28.28.1
4523 172.56.56.7
그리고 그것을 다음과 같이 변환하십시오.
ABC
12345 12345 192.168.1.12
54321 54321 10.10.2.23
98765 98765 192.168.2.52
56789 56789 172.16.2.2
DEFG
07418 07418 192.168.11.56
8529 8529 10.11.3.55
BBBG
12365
9879 9879 10.17.25.12
8596 8596 192.168.7.23
7485 4523 172.56.56.7
NMKL
3652 3652 172.28.28.1
4523 4523 172.56.56.7
아니면 더 나은
ABC
12345 192.168.1.12
54321 10.10.2.23
98765 192.168.2.52
56789 172.16.2.2
DEFG
07418 192.168.11.56
8529 10.11.3.55
BBBG
12365
9879 10.17.25.12
8596 192.168.7.23
7485 172.56.56.7
NMKL
3652 172.28.28.1
4523 172.56.56.7
첫 번째 열의 숫자는 분명히 페이지 하단의 IP 주소에 연결된 ID로 간주됩니다.
id는 약어이기도 합니다. 다음과 같은 명령을 사용하십시오.
sed -E '$!N;/^(\S+\s+)(.*)\n\1/!P;s//\n\1\2<br>/;D'
약간의 수정 후에 나는 꽤 가까워 졌다고 느낍니다.
내 시도는 다음과 같이 실패했습니다.
sed -E '$!N;/^([0-9]+)(.*)\n\1/!P;s//\n\1\2 /;D' file.xml
또는
sed -E '$!N;/^([[:digit:]]+)(.*)\n\1/!P;s//\n\1\2 /;D' file.xml
파일은 XML로 시작되었고 불필요한 정보를 천천히 제거했습니다. ID 번호의 크기는 늘어날 수 있습니다. 모든 공간은 단일 공간입니다. 기본적으로는 약어의 ID번호를 IP주소와 일치시키고, 그 ID를 IP주소의 약어에 넣어주고 싶습니다.
캡처 그룹이 숫자로 시작하는 모든 행을 선택하지 않는 것 같습니다. 또한 정규식에 if 조건이 필요할 수도 있다고 생각하는데 sed
, 이를 구현하는 방법을 잘 모르겠습니다.
답변1
댓글에 쓴 것처럼 귀하의 예가 귀하의 설명과 일치하지 않는 것 같지만 실제로는 비슷한 것을 찾고 있다고 가정합니다.
sed 'H;x;s/\(\n[0-9]*\)\(\n.*\)*\1\( .*\)$/\1\3\2/;h;$!d;s/^\n//
아이디어는 예약된 공간의 모든 행을 수집하고 마지막 행이 이전에 가지고 있던 ID로 시작하는지 테스트하는 것입니다.
H;x
공간을 유지하기 위해 모든 행을 추가한 다음 유지 공간과 패턴 공간을 교환한다는 의미입니다. 이것은 처음에 유용한 개행 문자를 넣습니다.s/\(\n[0-9]*\)\(\n.*\)*\1\( .*\)$/\1\3\2/
ID 행(숫자로만 구성됨)을 찾아 마지막으로 추가된 행이 해당 ID와 일치하는지 테스트합니다. 그렇다면 ID 뒤의 나머지 행을 이동하십시오. 다음*
`(\n.)말도 안되는 소리처럼 들릴 수도 있지만, IP 라인이 ID 라인 바로 뒤에 있을 수도 있기 때문에 이런 상황에 대한 대처가 필요합니다.h;$!d
해당 라인을 예약된 공간에 다시 저장하고 출력 없이 다음 라인을 계속 진행합니다.s/^\n//
마지막으로 시작 개행 문자를 제거합니다.x;s/(\n[0-9])(\N.)\1([0-9 .]*)/\1\3\2/;x;$!d;g;s/^\n//'
확장 정규식 업데이트
-E
확장 정규식( 질문에 표시된 옵션)을 사용하려는 경우 구문은 다음과 같습니다.
sed 'H;x;s/(\n[0-9]*)(\n.*)*\1( .*)$/\1\3\2/;h;$!d;s/^\n//
그러나 역참조( )는 POSIX ERE 표준의 일부가 아니므로 모든 버전에서 \1
이를 구현하는 것은 아닙니다.sed