2단계 문자열 편집을 수행하려고 합니다.
- 문자열 "payload"와 일치합니다. 찾은 경우 출력 파일에 표시된 대로 "#if #endif" 코드를 추가합니다.
- 그런 다음 "payload"가 포함된 줄을 복사하여 "upper_payload"로 바꾸고 "if endif" 조건에 붙여넣습니다.
입력 파일:
Let's see if this works or not payload.
alskdjaslkdjn.
aslkdjbnalkgfjbaglbjbjdgfsbkgjbsg;
Also here is another_payload.
alskdjbnalgkjb.
kjhsdfjlkgfjlknbsgdfljkbgsbljk((*&)(&;
예상 출력 파일:
Let's see if this works or not payload.
#if defined(NV_C2C_UPPER_PD)
Let's see if this works or not upper_payload.
#endif
alskdjaslkdjn.
aslkdjbnalkgfjbaglbjbjdgfsbkgjbsg;
Also here is another_payload.
#if defined(NV_C2C_UPPER_PD)
Also here is another_upper_payload.
#endif
alskdjbnalgkjb.
kjhsdfjlkgfjlknbsgdfljkbgsbljk((*&)(&;
여러 텍스트 파일에서 실행할 수 있도록 쉘 파일에 다음 코드를 작성했습니다.
#!/bin/csh -f
sed -i '/payload/a #if defined(NV_C2C_UPPER_PD)\n#endif' $1
sed -i "/NV_C2C_UPPER_PD/a `sed -n '/payload/s/payload/upper_payload/p' $1`" $1
위의 쉘 스크립트를 사용하여 다음과 같은 명령을 전달할 때:
> ./my_shell.sh test.txt
텍스트 파일은 다음 출력으로 수정됩니다.
Let's see if this works or not payload.
#if defined(NV_C2C_UPPER_PD)
Let's see if this works or not upper_payload.
#endif
alskdjaslkdjn.
aslkdjbnalkgfjbaglbjbjdgfsbkgjbsg;
Also here is another_payload.
#if defined(NV_C2C_UPPER_PD)
Let's see if this works or not upper_payload.
#endif
alskdjbnalgkjb.
kjhsdfjlkgfjlknbsgdfljkbgsbljk((*&)(&;
또한 터미널에 다음 오류/경고가 표시됩니다.
sed: can't read Also here is another_upper_payload.: No such file or directory
출력에서 행이 잘못 복사되었기 때문에 두 번째 "upper_payload" 대체가 잘못된 것을 확인할 수 있습니다. "another_payload"를 포함하는 새 줄 대신 첫 번째 줄을 복사합니다.
다른 옵션을 시도했지만 문제를 해결하지 못했습니다. 도움을 받기를 바랍니다.
답변1
표현식 sed
중 하나에 대한 입력을 생성하기 위해 다른 프로세스를 호출하는 대신 , 트리거 하위 문자열( )이 발견되는 즉시 명령을 사용하여 현재 행을 재구성하는 것이 좋습니다 .sed
s///
payload
/payload/!b
s/.*/&\
#if defined(NV_C2C_UPPER_PD)\
&\
#endif/
s/payload/upper_&/2
위의 편집 스크립트는 sed
먼저 트리거 문자열이 포함된 모든 줄을 건너뜁니다. 레이블 없이 사용하면 ("branch") 명령이 b
스크립트 끝으로 이동합니다.
나머지 줄에서는 전체 내용을 그 자체로 바꾸고 그 다음 줄로 바꾸고 #if
다시 원래 줄로 바꾸고 그 다음 #endif
줄로 바꿉니다. s///
이 명령은 위와 같이 이스케이프된 경우 개행 문자를 삽입하는 데 사용할 수 있습니다(GNU에서는 sed
리터럴 개행 문자 삽입도 허용합니다 \n
).
그러면 두 번째로 나타나는 문자열이 별도의 대체 payload
문자열 앞에 추가 됩니다.upper_
이 솔루션은 트리거 문자열이 한 줄에 여러 번 발생하지 않거나 마지막 교체가 올바른 하위 문자열을 대체하지 않는다고 가정합니다.
명령줄에서,
sed -e '/payload/!b' \
-e 's/.*/&\
#if defined(NV_C2C_UPPER_PD)\
&\
#endif/' \
-e 's/payload/upper_&/2' file
또는 스크립트에 대해 별도의 스크립트 파일을 사용하십시오.
sed -f script file
또는 여기에서 스크립트 문서를 사용하세요.
sed -f /dev/stdin file <<'SED_SCRIPT'
/payload/!b
s/.*/&\
#if defined(NV_C2C_UPPER_PD)\
&\
#endif/
s/payload/upper_&/2
SED_SCRIPT
또는 GNU를 사용하여 sed
,
sed -e '/payload/!b' \
-e 's/.*/&\n#if defined(NV_C2C_UPPER_PD)\n&\n#endif/' \
-e 's/payload/upper_&/2' file
결과:
Let's see if this works or not payload.
#if defined(NV_C2C_UPPER_PD)
Let's see if this works or not upper_payload.
#endif
alskdjaslkdjn.
aslkdjbnalkgfjbaglbjbjdgfsbkgjbsg;
Also here is another_payload.
#if defined(NV_C2C_UPPER_PD)
Also here is another_upper_payload.
#endif
alskdjbnalgkjb.
kjhsdfjlkgfjlknbsgdfljkbgsbljk((*&)(&;
답변2
당신은 이것을 시도 할 수 있습니다sed
$ sed -i 's/\(.*\)\(payload\)\(.*\)/&\n#if defined(NV_C2C_UPPER_PD)\n\1upper_\2\3\n#endif/ ' input_file
\(.*\)\(payload\)
여기서는 일치 항목을 2개의 그룹으로 나누어 반환 시 쉽게 다시 참조할 수 있도록 합니다.
&
변경되지 않은 완전한 일치를 반환합니다
\1upper_\2
여기에서 필요한 순서대로 그룹을 반환하며, 삽입이 payload
허용될 upper_
때 까지 첫 번째 그룹이 일치합니다.payload
산출
$ sed 's/\(.*\)\(payload\)\(.*\)/&\n#if defined(NV_C2C_UPPER_PD)\n\1upper_\2\3\n#endif/' input_file
Let's see if this works or not payload
#if defined(NV_C2C_UPPER_PD)
Let's see if this works or not upper_payload
#endif.
alskdjaslkdjn.
aslkdjbnalkgfjbaglbjbjdgfsbkgjbsg;
Also here is another_payload
#if defined(NV_C2C_UPPER_PD)
Also here is another_upper_payload
#endif.
alskdjbnalgkjb.
kjhsdfjlkgfjlknbsgdfljkbgsbljk((*&)(&;
답변3
여기에는 이미 좋은 솔루션이 있지만 sed
개인적으로 awk
다음 솔루션을 선호합니다.
awk \
-v if='#if defined(NV_C2C_UPPER_PD)' \
-v endif='#endif' \
'
/payload/{
line=$0
gsub("payload","upper_payload",$0);
printf "%s\n%s\n%s\n%s\n",$line,if,$0,endif
next
}
1' file
답변4
POSIXly를 사용하는 한 가지 방법은 다음과 같습니다.
sed -e 'p
/payload/!d
s//upper_&/
i\
#if defined(NV_C2C_UPPER_PD)
a\
#endif
' file
줄바꿈을 이스케이프 처리하고 싶지 않다면 POSIXly를 준수하면서 다음을 수행할 수 있습니다.
sed -e 'p
/payload/!d
s//upper_&/
H;s/.*//;x;G
s/^/#if defined(NV_C2C_UPPER_PD)/
s/$/#endif/
' file