Bash를 사용하여 동일한 단어가 포함된 부분을 삭제하는 방법

Bash를 사용하여 동일한 단어가 포함된 부분을 삭제하는 방법

디렉토리에 여러 개의 파일이 있고 각 파일에서 부분 단어를 제거하고 싶습니다. 각 파일의 너비와 높이 숫자가 다르므로 제거하고 싶습니다.

지금은 다음을 사용하고 있지만 숫자가 많아지면 더 좋은 방법이 있을 것 같습니다.

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.heightxmlstarlet

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,\}"정규식입니다 .widthheight=

정규식(및 기타)에 대한 유용한 가이드는 여기에서 찾을 수 있습니다.글리모어

하지만, 제공하는 형식은 XML과 같은 일반적인 형식이며 REGEX 도구를 사용하여 이러한 형식을 처리할 때 몇 가지 위험이 있다는 점에 유의하세요. 일반적으로 일치하는 파서가 선호됩니다.

관련 정보