sed를 사용하여 여러 문자를 바꾸는 방법은 무엇입니까?

sed를 사용하여 여러 문자를 바꾸는 방법은 무엇입니까?

이 스크립트가 있습니다.

replace 3

echo 12345 | sed "s/^\(.\){"$1"}/\1hi/"

나는 또한 이것을 시도했습니다 :

echo 12345 | sed "s/^\(.{"$1"}\)/\1hi/"

이 경우 스크립트에서 "12345"(123hi45)의 처음 3자 뒤에 "hi"를 추가하고 싶습니다. 이는 스크립트이므로 "3"은 매개변수이며 변경될 수 있습니다. 난 정말 여기에 갇혀있습니다. 미리 감사드립니다!

답변1

중괄호를 벗어나면 명령이 작동합니다( $1알 수 없는 이유로 따옴표 없이 인용하고 있습니다).

$ set -- 3
$ echo 12345 | sed "s/^\(.\{$1\}\)/\1hi/"
123hi45

반복 수정 {n}자는확장하다정규식 수정자, 여기서기초적인정규식은 다음과 같이 작성됩니다 \{n\}. sed유틸리티는 기본적으로 기본 정규식을 사용합니다.

일부 문자를 다음과 같이 다시 작성하여 저장할 수 있습니다.

echo 12345 | sed "s/^.\{$1\}/&hi/"

개인적으로는 다른 접근 방식을 취하겠습니다.


hi세 번째 문자 뒤에 문자열을 추가하려고 합니다 12345. 여기서 "세 번째"는 의 값으로 지정됩니다 $1.

echo 12345 | sed 's/./&hi/'"$1"

이면 표현식 은 다음과 같습니다 $1.3sed

s/./&hi/3

이는 세 번째 일치 항목(모든 문자)을 .동일한 문자( &대체 항목에 포함된 내용)로 바꾸고 hi.

이와 같이 명령 끝에 숫자를 배치하면 n해당 패턴의 :번째 발생이 대체됩니다.ssedsedn

테스트 실행(가독성을 위해 입력이 수정되고 대체됨):

$ set -- 3
$ echo abcde | sed 's/./&<hi>/'"$1"
abc<hi>de
$ set -- 4
$ echo abcde | sed 's/./&<hi>/'"$1"
abcd<hi>e
$ set -- 1
$ echo abcde | sed 's/./&<hi>/'"$1"
a<hi>bcde

답변2

다음은 나에게 효과적이었습니다.

#!/bin/sh

n=$1

echo 12345 | sed -r "s/(^.{$n})/\1hi/"

-r확장 정규 표현식(macos의 경우)을 지정하려면 sed 옵션을 사용해야 합니다 -E. 귀하의 입력이 스크립트( )에 어떻게 들어갈지 잘 모르겠 12345으므로 귀하의 예에 있는 그대로 두겠습니다.

관련 정보