예를 들어 파일에서 하이픈을 밑줄로 바꾸는 방법을 알고 있습니다.
그러나 주어진 파일에서 꺾쇠 괄호 안의 모든 텍스트에 대해 모든 하이픈을 밑줄로 바꾸고 싶습니다.
예를 들어 다음 파일은 다음과 같습니다.
<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 구문 분석기를 사용합니다 .yq
https://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