특정 문자를 대체하지만 () 안에 있는 경우에는 대체하지 않습니다.

특정 문자를 대체하지만 () 안에 있는 경우에는 대체하지 않습니다.

파일을 더 읽기 쉽게 만드는 한 줄 명령을 찾고 있습니다. 그룹에 속하지 않는 한 ;모든 문자를 로 바꾸고 싶습니다 . 이것은 방화벽에 있으므로 bash 등만 사용할 수 있습니다.newline()

입력 예:

ProductName: Threat Emulation; product_family: Threat; Destination: (countryname: United States; IP: 127.0.0.1; repetitions: 1) ; FileName: (file_name: myfile) ;

예상 출력:

ProductName: Threat Emulation
product_family: Threat
Destination: (countryname: United States; IP: 127.0.0.1; repetitions: 1)
FileName: (file_name: myfile)

답변1

sed의 정규식은 약간 혼란스럽기는 하지만 작동합니다.

sed '
    :a                                                 #mark return point
    s/\(\(^\|)\)[^(]\+\);\s*\([^)]\+\((\|$\)\)/\1\n\3/ #remove ; between ) and (
    ta                                                 #repeat if substitute success
    s/[[:blank:];]\+$//                                #remove ; with spaces at end
    '

Breif 정규식 설명:

  • ^\|)선으로 시작하거나)
  • [^(]\+이외의 모든 기호(
  • ;\s*가능한 공백이 있는 세미콜론
  • (\|$줄이 끝날 때까지 또는(

답변2

awk가 있으면 괄호를 필드 구분 기호로 사용할 수 있습니다.

awk -F '[()]' '{
    for (i=1; i<=NF; i+=2) {
        if ($i) {
            gsub(/; */,"\n",$i)
            printf "%s", $i
            if ($(i+1)) printf "(%s)", $(i+1)
        }
    }
    print ""
}' <<END
ProductName: Threat Emulation; product_family: Threat; Destination: (countryname: United States; IP: 127.0.0.1; repetitions: 1) ; FileName: (file_name: myfile) ;
END
ProductName: Threat Emulation
product_family: Threat
Destination: (countryname: United States; IP: 127.0.0.1; repetitions: 1) 
FileName: (file_name: myfile) 

후행 세미콜론은 후행 개행 문자를 제공합니다.

관련 정보