sed를 사용하여 숫자와 문자 패턴을 바꿉니다.

sed를 사용하여 숫자와 문자 패턴을 바꿉니다.

다음과 같은 파일이 있습니다.

some
arbitrary number of
leading
lines
a prefix followed by wmd v0.0.0-20220406135915-ce5e3ee6c6bf
some
trailing
lines

이는 파일의 모양을 보여주는 예일 뿐입니다. 내가 관심 있는 제품 라인의 상수는 다음과 같습니다.

  • 항상 가 있고 wmd v0.0.0-그 뒤에는
  • 14자리 숫자 뒤에
  • 하이픈 다음에
  • 영숫자 12자

해당 부분을 쉘 변수의 값으로 대체할 sed수 있는 명령을 어떻게 작성할 수 있습니까 ?20220406135915-ce5e3ee6c6bfnew_text

즉, new_text값이 있는 경우 99999999999999-aaaaaaaaaaaa다음 출력을 생성하는 명령 부분을 찾고 싶습니다 <whatever goes here>.sed

$ sed -e "s/wmd v0.0.0-<whatever goes here>/wmd v0.0.0-$new_text/" my-file.txt
some
arbitrary number of
leading
lines
a prefix followed by wmd v0.0.0-99999999999999-aaaaaaaaaaaa
some
trailing
lines

답변1

\{..\}수량자를 사용하여 문자 클래스가 일치해야 하는 횟수를 지정할 수 있습니다.

sed -e "s/wmd v0\.0\.0-[0-9]\{14\}-[0-9a-f]\{12\}/wmd v0.0.0-$new_text/"
#               ~  ~   ~~~~~~~~~~~~~~~~~~~~~~~~~~

또한 점은 정규 표현식에서 특별한 의미를 갖습니다. 백슬래시를 사용하면 문자 그대로 일치하게 됩니다.

또한 $new_text슬래시나 sed에 고유한 다른 문자를 포함하면 명령이 중단될 수 있습니다.

답변2

사용행복하다(이전 Perl_6)

~$ raku -pe 's/ "wmd v0.0.0-" <( \d**14 \- \w**12 )> /99999999999999-aaaaaaaaaaaa/'  my-file.txt

#OR

~$ raku -pe 's[ "wmd v0.0.0-" <( \d**14 \- \w**12 )> ] = "99999999999999-aaaaaaaaaaaa";'  my-file.txt

입력 예:

some
arbitrary number of
leading
lines
a prefix followed by wmd v0.0.0-20220406135915-ce5e3ee6c6bf
some
trailing
lines

예제 출력:

some
arbitrary number of
leading
lines
a prefix followed by wmd v0.0.0-99999999999999-aaaaaaaaaaaa
some
trailing
lines

위의 정규식은 4개의 정규식 원자를 사용하여 일치 항목인 "wmd v0.0.0-", \d**14\-을 식별합니다 \w**12. 물론, 따옴표에 문제가 있는 경우 "wmd v0.0.0-"다음과 같이 작성할 수 있습니다 wmd \s v0 \. 0 \. 0 \-(즉, 문자가 아닌 모든 alnum항목은 백슬래시로 이스케이프 처리됩니다).

캡처 태그는 를 <( … )>제외한 모든 항목을 제거 \d**14 \- \w**12하고 연산자의 오른쪽 절반을 교체하는 데 사용됩니다 s///.

위 코드 \w의 약어에는 밑줄이 <alnum>포함되어 있습니다 _. _밑줄(실제로는 12개의 연속된 밑줄 문자)을 허용하지 않으려면 _다음과 같이 사용하세요 <[0..9a..z]>**12.

마지막으로 다음과 같이 대체를 변수로 추상화하여 대체를 단순화할 수 있습니다.

~$ raku -pe 'my $new = "99999999999999-aaaaaaaaaaaa"; \
             s/ "wmd v0.0.0-" <( \d**14 \- <[0..9a..z]>**12 )> /$new/;'  my-file.txt

https://raku.org

관련 정보