Makefile의 Sed 사용량 이해

Makefile의 Sed 사용량 이해

저는 특히 Makefile에서 사용될 때 Linux에서 sed 명령의 사용법을 이해하려고 노력하고 있습니다. 설명하려는 명령을 아래에 포함시켰습니다. 지금까지 내 설명은 sed가 텍스트를 대체하고 inittab 파일 내에서 작동한다는 것입니다. 그러나 다양한 기호가 의미하는 것 외에 sed가 무엇을 찾고 무엇을 대체하는지 정확히 이해할 수 없습니다. 나는 궁극적으로 1) 이것이 어떻게 작동하는지 이해하고, 2) 그것을 편집하여 대체 텍스트에 두 번째 텍스트 줄을 추가하고 싶습니다(지금은 sed를 통해 전송되는 줄이 단 한 줄이라고 생각합니다).

문맥상 제가 이해하고 편집하려는 이 코드 조각은 Busybox의 busybox.mk에서 가져온 것입니다. 저는 sed 및 makefile을 처음 사용하므로 귀하가 제공할 수 있는 지침에 감사드립니다!

$(SED) '/# GENERIC_SERIAL$$/s~^.*#~$(SYSTEM_GETTY_PORT)::respawn:/sbin/getty -L $(SYSTEM_GETTY_OPTIONS) $(SYSTEM_GETTY_PORT) $(SYSTEM_GETTY_BAUDRATE) $(SYSTEM_GETTY_TERM) #~' \$(TARGET_DIR)/etc/inittab

답변1

비밀스러워 보이지만 다음과 같은 기능을 수행한다고 생각합니다.

/# GENERIC_SERIAL$$/ ->   Only apply the subsequent substitution when 
                          the line matches that pattern. And since this 
                          is a Makefile, you need to write `$$` 
                          to have a literal `$`.

s~^.*# ->                 Match anything (`.*`) zero or more characters, but 
                          it should include the `#` symbol at the end. 
                          This uses `~` as a separator instead of the 
                          most common `/`
~$(SYSTEM_GETTY_PORT)...
 $(SYSTEM_GETTY_TERM) #~ -> and replace it with this horrific line 
                          including Makefile variables that should be defined 
                          elsewhere or passed as flags.

\$(TARGET_DIR)/etc/inittab -> obviously, this is the file in which the
                          previous substitution should be applied.

즉,sed /<pattern>/s~<match>~<replacement>~ <file>

관련 정보