![sed를 사용하여 숫자와 문자 패턴을 바꿉니다.](https://linux55.com/image/205767/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%88%AB%EC%9E%90%EC%99%80%20%EB%AC%B8%EC%9E%90%20%ED%8C%A8%ED%84%B4%EC%9D%84%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
다음과 같은 파일이 있습니다.
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-ce5e3ee6c6bf
new_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