patsubst() 사용

patsubst() 사용

m4가 단어 중간에 매크로를 대체하도록 설득할 수 있는 방법이 있나요?

나는 이 파일 day.m4를 원합니다:

define(Sat,Cat)dnl
Saturday

그리고 이 명령은:

m4 day.m4

다음 출력을 생성합니다.

Caturday

표시된 것처럼 m4는 이 작업을 수행하지 않습니다.

또는 sed가 동시에 여러 대체를 수행하도록 하는 방법이 있습니까? 즉, 교체할 때마다 파일을 전달할 필요가 없습니다.

여러 개의 sed 명령을 함께 연결하거나 sed와 m4의 조합을 사용할 수도 있는데 나쁘지는 않겠지만 하나의 입력 파일과 하나의 명령으로 이를 수행할 수 있는 편리한 방법이 있다면 더 좋을 것입니다.

다른 일반적인 도구도 작동합니다.

내 목표는 템플릿에서 파일을 만드는 데 사용하는 것입니다. 교체할 토큰의 대부분은 공백으로 구분됩니다.

답변1

필요한 것은 다음과 같습니다.

sed -e sub1 -e sub2 file

여기서 sub의 형식은 다음과 같습니다.

s/sat/cat/g

모든 대체 항목을 파일에 넣고 다음을 사용하여 실행할 수도 있습니다.

sed -f scriptfile filetomodify

답변2

patsubst() 사용

m4단어 내를 포함하여 어디에서나 대체를 수행할 수 있는 검색 및 대체 기능을 제공합니다.빠따스테:

내장: patsubst(문자열, 정규식, [대체])

검색일치정규식및 대안대안모든 게임.

여기에는 새 정의 설정이 포함되지 않으므로 기본적으로 향후 모든 입력에 적용할 수 없습니다. 대신 함수 호출 내에 전체 입력 텍스트를 "샌드위치"해야 합니다.

patsubst(dnl
[...]
Saturday
[...]
,`Sat',`Cat')dnl

체인지워드() 사용

m4도 제공합니다단어를 바꾸다:

처리되는 파일은 m4인용된 문자열, 단어(잠재적인 매크로 이름) 및 단순 토큰(기타 단일 문자)으로 구분됩니다. 처음에 단어는 다음 정규식으로 정의됩니다.

[_a-zA-Z][_a-zA-Z0-9]*

다음을 사용하여 changeword이 정규식을 변경할 수 있습니다 .

불행하게도 이 changeword기능은 표준이 아닙니다. 컴파일 타임에 요청한 경우 --enable-changeword에만 사용할 수 있습니다 .

활성화한 후 다음을 수행할 수 있습니다. m4세 글자 단어만 허용되도록 강제합니다 .

define(`Sat',`Cat')dnl
changeword(`[A-Za-z][a-z]?[a-z]?')dnl
Saturday

그러나 changeword다른 문제도 있습니다:

정규식원하는 최종 패턴의 각 접두사는 정규식에서도 허용된다는 제약 조건을 준수해야 합니다.

[...]

어휘 규칙을 강화하면 일반적으로 일부 내장 기능을 사용할 수 없게 되므로 유용성이 떨어집니다.

dnl위의 패턴은 추가 정의를 방지합니다( 정확히 세 글자이기 때문에 인식만 가능합니다 ). 따라서 표준이 아닐 뿐만 아니라 원하는 작업에 적합하지도 않습니다.

관련 정보