>

텍스트를 처리해야하는 쉘 스크립트를 작성 중입니다. 다음과 같은 텍스트가 있습니다.

read build { file1 file2 file3 }
check build { file2 file3 file4 }
read build { file4 file5 file6 }

모든 파일 앞에 텍스트를 추가하고 싶습니다. 즉, '읽기 빌드'줄에서 괄호 안에 포함 된 단어를 의미합니다.이를 달성하기위한 가장 좋은 아이디어는 무엇이라고 생각하십니까? 결과는 다음과 같아야합니다.

read build { MY_ADDED_WORDfile1 MY_ADDED_WORDfile2 MY_ADDED_WORDfile3 }
check build { file2 file3 file4 }
read build { MY_ADDED_WORDfile4 MY_ADDED_WORDfile5 MY_ADDED_WORDfile6 }

그 줄을 그레 핑하고 다음에이 "파일"문자열을 추가하고 싶은 단어로 배열하고 연결하려고 시도했지만 "스마트 한"솔루션이 아니라고 생각합니다. 도와 주셔서 감사합니다.

입력 파일은 다음과 같습니다 :

set build { file1 file2 file3 file4 }
check $build
read build -new -f $build
read build -new -f { fileA fileB fileC fileD }
set build {file5 file6 file7 }
read build -old -f $build
read build -old -f { fileX fileZ fileD }
check_that_building

출력은 다음과 같아야합니다 :

set build { file1 file2 file3 file4 }
check $build
read build -new -f $build
read build -new -f { MY_ADDED_WORDfileA MY_ADDED_WORDfileB MY_ADDED_WORDfileC MY_ADDED_WORDfileD }
set build {file5 file6 file7 }
read build -old -f $build
read build -old -f { MY_ADDED_WORDfileX MY_ADDED_WORDfileZ MY_ADDED_WORDfileD }
check_that_building

괄호를 열기 전에는 항상 공백이 있지만 여는 브래킷 뒤에 공백이없고 괄호를 닫기 전에 공백이있을 수 있지만 항상 그런 것은 아닙니다. 가능한 경우 :

read build -old -f { fileX fileZ fileD }
read build -old -f {fileX fileZ fileD }
read build -old -f { fileX fileZ fileD}
read build -old -f {fileX fileZ fileD}

  • 답변 # 1

    sed 에서 어떻게해야하는지 즉시 알 수 없었습니다 하나 이상의 캐릭터가 있다고 가정하지 않고 입력에 나타나지 않는 것으로 알려져 있습니다. 나는 # 가정  입력 (또는 추가 한 단어)에는 나타나지 않습니다. 이것은 작동하는 것 같습니다 :

    sed '/read build/ {
            s/{/{ /
            : fruit
            s/\({.*\) \([^}# ][^ ]*\)/\1#MY_WORD\2/
            t fruit
            s/#/ /g
            s/{ /{/
    }'
    
    
    read build 를 포함하는 라인 먼저 { 뒤에 공백을 삽입합니다. . 그런 다음 { 뒤의 공간을 검색합니다. 단어 직전 (파일명) 공간을 # 로 바꿉니다. , 당신의 단어를 삽입 돌아가서 더 많은 것을 찾습니다. (와이즈 와이즈)  임의의 루프 레이블입니다.) 그것들을 모두 찾으면 모든 fruit 를 돌립니다.  문자를 다시 공백으로 삽입 한 공간을 제거합니다 ( # 뒤) ).

    { 에 대한 비트 외에  입력에서 발생하지 않는 이것은 이것을 가정합니다

    #  각 } 에서 공백이 아닌 마지막 문자입니다.  줄과

    공백은 공백 일뿐입니다. 탭이 없습니다.

    <시간> read build 에서 :

    awk
    
    

    awk '/read build/ { in_braces=0 for (i = 1; i <= NF; i++) { if ($i == "{") in_braces=1 else if (substr($i,1,1) == "{") { $i = "{MYWORD" substr($i,2) in_braces=1 } else if ($i == "}") in_braces=0 else if (in_braces) $i = "MY_WORD" $i } } { print }' 마다  선, 줄의 모든 단어 (필드)를 반복합니다. 상태 변수 ( read build )를 사용합니다. ) 그것이 in_braces 사이에 있는지 추적  그리고 { ; 이 경우 추가 된 단어로 시작하도록 각 단어를 수정합니다. 두 가지 약간 다른 경우를 처리해야합니다.

    단어이 (가)인 경우 } , 모든 후속 단어 수정을 시작하도록 플래그를 설정하고

    단어가시작되는 경우 { 실제로는 다음과 같은 형태의 화합물입니다. 와이즈 비즈 it을 연결로 수정하십시오. 와이즈 비츠 , 추가 된 단어 및 { 파일 이름. 또한 모든 후속 단어를 수정하도록 플래그를 설정하십시오.

    탭을 단어 구분 기호로 사용할 수 있지만 공백을 단일 공간으로 축소한다는 단점이 있습니다. 예를 들어, 입력

    {fileX
    
    

    출력을 생성합니다

    {
    
    

    또한, 이것은 가정합니다

    와이즈 비즈  단어의 시작 부분에 있습니다 (즉, 앞에 공백이 있음). 그리고

    fileX  각 read build { file1 file2 file3 } 에서 공백이 아닌 마지막 문자입니다.  선, 또는 별도의 단어 (예 : 앞뒤에 공백이 있음)

    여러 개의 중괄호 세트를 허용합니다. 예 :

    read build { MY_WORDfile1 MY_WORDfile2 MY_WORDfile3 }
    
    
    {

관련 자료

  • 이전 debian - 하나의 VPS 백업 파일을 사용하여 복제 VPS를 구축하는 올바른 방법이 있습니까?
  • 다음 radeonmodeset = 0 인 Linux 민트