특정 표현을 어떻게 sed합니까?

특정 표현을 어떻게 sed합니까?

나는 성공하지 못한 채 한동안이 문제를 다루어 왔습니다. sed가 필요해요

1.0.0/hk/base/9/7/56.png2003444

이것을 입력하세요

hk,9,7,56,200,3444

어떤 도움이라도 대단히 감사하겠습니다.

편집하다.

첫 번째 줄은 파일 내의 문자열을 나타냅니다. 두 번째 줄 - 결과가 CSV 파일에 사용됩니다.

섹션에는 고정된 수의 문자가 포함됩니다(항상). 1.0.0/hk/base/ 섹션은 문자 수에 따라 달라질 수 있습니다.9/7/56 2003444

나는 이렇게 하라는 지시를 받았습니다:

-e 's/\/base\//,/g'

다음을 반환합니다:

1.0.0/hk,9/7/56.png2003444

하지만 다른 일을 처리하는 방법을 모르겠습니다.

답변1

이 문자열의 경우 다음 변환이 작동합니다.

sed 's|.*/\(.*\)/.*/\(.*\)/\(.*\)/\(.*\)\.png\(...\)\(....\)|\1,\2,\3,\4,\5\,\6|'

마지막 두 부분의 길이가 다른 경우를 포함하여 다른 줄의 형식이 정확하게 지정되지 않은 경우 문제가 발생합니다.

답변2

파일이므로 Vim으로 하겠습니다. 윔스환상적이다정규식은 읽기가 매우 쉬우므로 훌륭한 교육 자료입니다.

:%s_\v^.{6}([^/]+)/([^/]+)/(\d+)/(\d+)/(\d+)\.png(\d{3})(\d{4})_\1,\2,\3,\4,\5,\6,\7_
  • \v매우 마법 같은 기능을 켜세요
  • ^줄의 처음부터 일치
  • .{6}처음 6자 가져오기( 1.0.0/)
  • ([^/]+)/( hk) 가 아닌 것
  • /이것/
  • ([^/]+)우리는 전에 만난 적이 있어요( base이 경기)
  • /-- || -- ||
  • (\d+)숫자 일치( 9)
  • /(\d+)/(\d+)소중한 것을 반복하세요 ( /7/56)
  • \.png이것은 분명해야합니다
  • (\d{3})정확히 세 개의 숫자200
  • (\d{,4})최대 4개의 숫자(더 강력하게 만들기 위해):3444

sed{}()[]( 이스케이프 및 삭제가 필요한 모든 항목과 함께 사용 \v)

답변3

구문 분석 중인 텍스트의 구조나 검색하려는 패턴을 알려주지 않았습니다. 그래서 나는 당신이 우리에게 준 예를 바탕으로 몇 가지 가정을 했습니다. ( 1.0.0/hk/base/9/7/56.png2003444).

-r괄호와 대괄호를 이스케이프 처리하면 스크립트를 읽기가 어려워지기 때문에 확장 정규식( )을 사용했습니다. ;슬래시( ) 대신 세미콜론( )을 사용하여 /명령을 구분하므로 슬래시도 이스케이프할 필요가 없습니다.

sed -r 's;([0-9]+\.){2}[0-9]+/([a-zA-Z]+)/[a-zA-Z]+/([0-9]+)/([0-9]+)/([0-9]+)\.[a-zA-Z]{3}([0-9]{3})([0-9]{4});\2,\3,\4,\5,\6,\7;g'

답변4

모든 답변에 감사드립니다. 나는 프로그래밍 세계에 처음 입문했고 이것은 나에게도 새로운 일입니다. 그래서 이것이 sed이 문제에 접근하는 구식 방식이기 때문에 배울 것이 많다고 생각합니다 . 그러나 나는 나에게 익숙한 특정 접근 방식을 따랐기 때문에 결국 다음과 같이 문제를 해결하게 되었습니다.

sed -e 's/1.0.0\///g'     \
    -e 's/\/base\//,/g'   \
    -e 's/\//,/g'         \
    -e 's/.png/,/g'       \
    -e 's/,\([0-9][0-9][0-9]\)\([0-9]*\)$/,\1,\2/g'

관련 정보