저는 특히 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>