특정 단어와 문자를 바꾸는 방법

특정 단어와 문자를 바꾸는 방법

width첫 번째 파일에 추가하려는 디렉토리에 여러 개의 파일이 있습니다 >. 각 파일에는 서로 다른 width값이 있습니다.

파일에는 다음이 포함됩니다.

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="512px"
 height="512px"><path //removed for brevity

다른 파일에는 다음이 있습니다.

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="415px"
 height="450px"><path //removed for brevity

등.

나는 그것들을 다음으로 바꾸고 싶습니다 :

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="{size}" 
height="{size}" viewBox="0 0 512 512" fill={color} 
class={$$props.class} {...$$restProps} aria-label={ariaLabel}><path 
//removed for brevity

다음을 시도했지만 작동하지 않습니다.

sed -i 's/width.*>/width={size} height={size} viewBox="0 0 512 512" 
fill={color} 
class={$$props.class} {...$$restProps} aria-label={ariaLabel}/' ./*.*

답변1

-ised차용 구현을 위한 일부(전부는 아님) 옵션이 있습니다 perl. perl여기서는 더 쉬워집니다.

perl -0777 -pi -e 's{\bwidth=".*?>}{width="{size}" 
height="{size}" viewBox="0 0 512 512" fill={color} 
class={\$\$props.class} {...\$\$restProps} aria-label={ariaLabel}>}gs' yourfile

어디:

  • -0777한 번에 한 줄이 아닌 전체 파일을 처리합니다.
  • s{...}{...}는 또 다른 작성 방법 이지만 패턴이나 대체 문자 s/.../.../에 대해 걱정할 필요가 없습니다 . , 일치하는 한./{}
  • *?예, 탐욕스럽지 않은 버전입니다 *.
  • \bwidth="는 단어 경계이므로 minwidth="예를 들어 일치하지 않습니다. 하지만 여전히 일치합니다 min-width=". 이것이 문제라면 (?<=\s)(를 나타내는앞에 공간만 있으면).
  • 이 플래그는 필요한 경우 s여러 줄에 걸쳐 있을 수 있습니다 (그리고 개행과 일치할 수도 있습니다). 첫 번째 항목만 바꾸려면 이 플래그를 제거하세요..*.g

태그 에서만 <svg>이 작업을 수행하세요 .

perl -0777 -pi -e 's{<svg[^<>]*\bwidth="\K.*?>}{{size}" 
height="{size}" viewBox="0 0 512 512" fill={color} 
class={\$\$props.class} {...\$\$restProps} aria-label={ariaLabel}>}gs' yourfile

답변2

형식이 개행을 허용하는 동안 문제는 sed한 줄씩 작동 할 수 있습니다 svg. 여기서는 그럴 것 같습니다. 따라서 width뒤에 a가 오는 행이 없으므로 >대체가 없습니다.

그러나 path요소가 같은 행에 있을 수 있으므로 상황 이 더 나쁠 수도 있습니다 .*.

width및 각각 다음을 교체하는 것이 좋습니다 height.

sed 's/width="[^"]*/width="{size}/;s/height[^"]*"/height="{size}" viewBox="0 0 512 512" fill={color} class={$$props.class} {...$$restProps} aria-label={ariaLabel} /' ./*.*
  • 이 옵션을 제거했습니다 -i. 테스트하기 전에 다시 추가하지 마세요.
  • [^"]*가 아닌 모든 문자와 일치하므로 "예상보다 많은 문자를 제거하는 것을 방지합니다.
  • 의도적인 것인지 알 수 없기 때문에 코드에서 줄 바꿈을 제거했습니다. 대체의 실제 개행 문자 앞에는 백슬래시가 와야 합니다.

답변3

사용 sed.

$  sed -i.bak s'~\(width="\)[^>]*~\1{size}" height="{size}" viewBox="0 0 512 512" fill={color} class={$$props.class} {...$$restProps} aria-label={ariaLabel}~' input_file
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="{size}" height="{size}" viewBox="0 0 512 512" fill={color} class={$$props.class} {...$$restProps} aria-label={ariaLabel}><path //removed for brevity

관련 정보