나는 아마도 #include <stdint.h>
처음 1-30줄에 C 패키지가 있다는 것을 알고 있습니다. 파일에 LARGE_INTEGER
GNU 도구라는 단어가 포함되어 있으면 이전에는 해당 단어가 없었던 줄에 해당 단어를 추가하고 싶습니다.
[0,1] 일치 바꾸기
처음에는 항상 [0,1] 일치 항목을 다음과 같이 교체하려고 생각했지만 이제는 추가 교체가 불필요하고 피해야 한다고 생각합니다.
gsed -i '1-30s/^(#include <stdint.h>\n)?/#include <stdint.h>\n/'
이것을 거부하는 것이 좋습니다.
불일치를 나타내는 추가 ggrep 방법
상태를 먼저 살펴보고 필요하면 교체해주기 때문에 좋은 해결책이 아닐까 싶습니다. 이것철사while 루프 구조가 나오는 코드에 grep을 추가하는 것이 좋습니다.여기
while read -d '' -r filepath; do \
[ "$(ggrep -l "LARGE_INTEGER" "$filepath")" ] && \
[ "$(ggrep -L "#include <stdint.h>" "$filepath") ] \
| gsed -i '1s/^/#include <stdint.h>\n/' "$filepath"
done
그러나 이것은
test.sh: line 5: stdint.h: No such file or directory
#include <stdint.h>
그리고 실제로 너무 많이 넣지 않고 라인 에 패키지를 추가하는 것은 잘못된 것입니다.
SED의 두 조건문을 효율적으로 결합하는 방법은 무엇입니까?
답변1
제가 당신의 글을 정확하게 해독했는지 잘 모르겠습니다. 다음 스크립트는 #include <stdint.h>
(1) 단어가 포함되어 LARGE_INTEGER
있고 (2) 아직 포함되지 않은 파일을 현재 디렉터리에 추가합니다 <stdint.h>
.
sed -i -e '1i\' -e '#include <stdint.h>' $(
egrep -c '#include +<stdint\.h>' $( fgrep -lw LARGE_INTEGER * ) | \
sed -n '/:0$/ { s/:0$//; p; }')
이 스크립트는 GNU sed
(for -i
)를 가정합니다.
상세히:
fgrep -lw LARGE_INTEGER *
현재 디렉토리에 다음 단어가 포함된 파일 나열LARGE_INTEGER
egrep -c '#include +<stdint\.h>'
#include <stdint.h>
위에서 찾은 파일의 발생 횟수를 계산합니다 .fgrep
sed -n '/:0$/ { s/:0$//; p; }'
일치하는 파일 0개를 선택하고 파일 이름만 유지하세요.sed -i -e '1i\' -e '#include <stdint.h>'
#include <stdint.h>
위에서 찾은 파일에 첫 번째 줄을 추가합니다 .