조건이 있든 없든 sed는 true입니다.

조건이 있든 없든 sed는 true입니다.

나는 아마도 #include <stdint.h>처음 1-30줄에 C 패키지가 있다는 것을 알고 있습니다. 파일에 LARGE_INTEGERGNU 도구라는 단어가 포함되어 있으면 이전에는 해당 단어가 없었던 줄에 해당 단어를 추가하고 싶습니다.

[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>위에서 찾은 파일에 첫 번째 줄을 추가합니다 .

관련 정보