파일의 꺾쇠 괄호 안의 하이픈을 밑줄로 바꿉니다.

파일의 꺾쇠 괄호 안의 하이픈을 밑줄로 바꿉니다.

예를 들어 파일에서 하이픈을 밑줄로 바꾸는 방법을 알고 있습니다.

그러나 주어진 파일에서 꺾쇠 괄호 안의 모든 텍스트에 대해 모든 하이픈을 밑줄로 바꾸고 싶습니다.

예를 들어 다음 파일은 다음과 같습니다.

<charset-params> 
    <input-charset> 
        <resource-path>/*</resource-path> 
        <java-charset-name>UTF-8</java-charset-name> 
    </input-charset> 
</charset-params>

다음과 같이 변경되어야 합니다:

<charset_params> 
    <input_charset> 
        <resource_path>/*</resource_path> 
        <java_charset_name>UTF-8</java_charset_name> 
    </input_charset> 
</charset_params>

UTF-8꺾쇠 괄호 안에 있지 않기 때문에 변경되지 않습니다 . 어떻게 해야 하나요?

답변1

하다

sed ': loop; s/\(<[^>]*\)-\([^>]*>\)/\1_\2/g; t loop'

, 가 아닌 여러 문자(0개 이상) s/\(<[^>]*\)-\([^>]*>\)/\1_\2/g, 하이픈( ), 가 아닌 다른 문자 묶음을 찾고 마지막으로 . 이전 부품 과 이후 부품 으로 교체됩니다 . 이 연산자는 한 번에 여러 대체를 수행하게 하지만 한 번에 하나씩만 수행할 수 있습니다 . 예를 들어,<>->>-_-g<>

<the-quick><brown-fox> <jumps-over> upside-down <the-lazy-dog>

로 변경됩니다

<the_quick><brown_fox> <jumps_over> upside-down <the-lazy_dog>

하이픈이 포함된 모든 <... 단어만 변경되지만 두 개의 하이픈( )이 포함된 단어는 두 번째 단어만 변경됩니다  . 대체 항목이 있으면 돌아가서 더 많은 대체 항목을 찾으라고 나와 있습니다 .><the-lazy-dog>-t loop

답변2

Perl을 사용하면 더 쉽습니다.

perl -pe 's{<.*?>}{$& =~ y/-/_/r}ge' < your-file

또는:

perl -i -pe 's{<.*?>}{$& =~ y/-/_/r}ge' your-file

i여러 위치에서 파일을 편집합니다.

답변3

파일에서 예제를 사용하십시오.

<charset-params>
    <input-charset>
        <resource-path>/*</resource-path>
        <java-charset-name>UTF-8</java-charset-name>
    </input-charset>
</charset-params>

다음 awk는 다음과 같이 작업을 수행합니다. ">"를 처리할 섹션의 끝으로 해석하고 "<"를 섹션의 시작으로 사용하므로 섹션 내부에서는 처리될 내용이 고려되지 않습니다. 섹션 내의 모든 항목이 필요한 gsub 대체에 대해 처리된 후 배열 부분에 저장됩니다. 그 후 스크립트는 범위 밖의 구분 기호 및 콘텐츠 처리를 재개해야 합니다.

awk ' {numrec=split($0,regs,">")
for (i=1; i<numrec; ++i){
  split(regs[i],part,"<")
  gsub("-","_",part[2])
  res = sprintf("%s%s",res, part[1] "<" part[2] ">")}
print res
res=""}' entraunder

결과는 다음과 같습니다.

<charset_params>
    <input_charset>
        <resource_path>/*</resource_path>
        <java_charset_name>UTF-8</java_charset_name>
    </input_charset>
</charset_params>

화타이

답변4

툴킷의 일부인 xq명령줄 XML 구문 분석기를 사용합니다 .yqhttps://kislyuk.github.io/yq/(이것은 잘 알려진 JSON 파서의 래퍼입니다 jq.):

xq -x '
    walk(
        if type == "object" then
            with_entries(.key |= gsub("-"; "_"))
        else
            .
        end
    )' file.xml

이는 주어진 XML 파일의 전체 구조를 재귀적으로 순회하며, 현재물건이 개체에 있는 모든 키의 모든 대시를 밑줄로 바꾸는 개체입니다.

예:

$ cat file.xml 
<charset-params> 
    <input-charset> 
        <resource-path>/*</resource-path> 
        <java-charset-name>UTF-8</java-charset-name> 
    </input-charset> 
    <something/>
</charset-params>
$ xq -x 'walk(if type == "object" then with_entries(.key|=gsub("-";"_")) else . end)' file.xml 
<charset_params>
  <input_charset>
    <resource_path>/*</resource_path>
    <java_charset_name>UTF-8</java_charset_name>
  </input_charset>
  <something></something>
</charset_params>

도구는 xq또는 옵션을 사용하여 내부 편집을 수행할 수 있습니다.-i--in-place

관련 정보