![Bash를 사용하여 동일한 단어가 포함된 부분을 삭제하는 방법](https://linux55.com/image/208545/Bash%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%8F%99%EC%9D%BC%ED%95%9C%20%EB%8B%A8%EC%96%B4%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EB%B6%80%EB%B6%84%EC%9D%84%20%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
디렉토리에 여러 개의 파일이 있고 각 파일에서 부분 단어를 제거하고 싶습니다. 각 파일의 너비와 높이 숫자가 다르므로 제거하고 싶습니다.
지금은 다음을 사용하고 있지만 숫자가 많아지면 더 좋은 방법이 있을 것 같습니다.
sed -i 's/width="12"//' ./*.*
sed -i 's/width="16"//' ./*.*
sed -i 's/width="24"//' ./*.*
sed -i 's/width="25"//' ./*.*
sed -i 's/width="45"//' ./*.*
sed -i 's/height="12"//' ./*.*
sed -i 's/height="16"//' ./*.*
sed -i 's/height="24"//' ./*.*
...
...
귀하의 도움에 감사드립니다. 감사해요.
답변1
입력이 XML이라고 가정하면 다음과 같이 보일 수 있습니다.
<?xml version="1.0"?>
<root>
<tag width="23" height="34"/>
<tag alt="something something" width="23" height="34"/>
<tag width="23" alt="something else" height="34"/>
<tag width="abba">Very wide</tag>
</root>
...그런 다음 다음과 같이 및 속성을 포함하는 각 문서 노드에서 및 속성을 제거할 수 있습니다 width
.height
xmlstarlet
xmlstarlet ed --delete '//@width' --delete '//@height' file.xml
...예제 문서에 따르면 다음을 생성합니다.
<?xml version="1.0"?>
<root>
<tag/>
<tag alt="something something"/>
<tag alt="something else"/>
<tag>Very wide</tag>
</root>
이름이 다음으로 끝나는 현재 디렉터리의 모든 파일에 대해 이 작업을 수행합니다 .xml
(파일이 너무 많지 않다고 가정).
xmlstarlet ed --inplace --delete '//@width' --delete '//@height' ./*.xml
이 옵션을 사용하면 각 파일의 편집이 내부에서 수행됩니다 --inplace
.
답변2
\(pattern\)
- 그룹foo\|bar
-또는 연산자[a-z]
- 문자 범위(로케일 설정 참고)\{m,n\}
- 각각 0이나 무한대를 나타내기 위해 m이나 n을 사용하지 않고 이전 패턴을 반복합니다.
=>는 큰따옴표 안의 양의 정수 와 일치 하거나 그 뒤에 오는 \(width\|height\)="[0-9]\{1,\}"
정규식입니다 .width
height
=
정규식(및 기타)에 대한 유용한 가이드는 여기에서 찾을 수 있습니다.글리모어
하지만, 제공하는 형식은 XML과 같은 일반적인 형식이며 REGEX 도구를 사용하여 이러한 형식을 처리할 때 몇 가지 위험이 있다는 점에 유의하세요. 일반적으로 일치하는 파서가 선호됩니다.