여러 파일에서 처음 10줄 제거

여러 파일에서 처음 10줄 제거

파일 이름은 (백개 파일) file00로 지정됩니다 file99. 그것들은 모두 같은 디렉토리에 있습니다. 100개의 파일을 모두 가져와서 각 파일의 처음 10줄을 삭제하려면 어떻게 해야 합니까? CentOS 7을 사용하고 있습니다.

답변1

file00그러면 다음 범위에 이름이 있는 모든 파일에서 처음 10줄이 제거됩니다 file99.

sed -i.bak -n '11,$p' file[0-9][0-9]

이를 위해서는 OSX에서 sed호출되는 GNU가 필요할 수 있습니다. gsed다른 sed의 경우 다음을 시도하십시오.

find file[0-9][0-9] -maxdepth 0 -type f -exec sed -i.bak -n '11,$p' {} \;

작동 방식:

  1. -i.baksed에게 파일을 수정하고 .bak 확장자를 가진 백업 파일을 생성하도록 지시합니다.

  2. -n명시적으로 요청하지 않는 한 어떤 줄도 인쇄하지 않도록 sed에 지시합니다.

  3. 11,$p$sed에게 라인 11에서 시작하여 파일의 마지막 라인으로 끝나는 라인을 인쇄하도록 지시합니다 ( 로 표시됨).

  4. file[0-9][0-9]file이름 뒤에 두 자리 숫자가 오는 모든 파일 과 일치하도록 확장되는 쉘 글로브입니다 .

선택하다

논리는 반전될 수 있습니다. 11번째 줄부터 명시적으로 인쇄하는 대신 (힌트: JigglyNaga) 처음 10개 줄을 삭제할 수 있습니다.

sed -i.bak '1,10d' file[0-9][0-9]

답변2

bash(또는 Bourne과 유사한 쉘) 및 GNU 또는 BSD에서 간단한 루프 사용 sed:

for f in file[0-9][0-9]; do
  sed -i '.bak' '1,10d' "$f"
done

편집 sed스크립트는 1,10d입력 스트림에서 1~10행을 제거합니다. 다른 라인이 출력됩니다. 파일에서 인라인 편집이 필요하지만 접미사를 사용하여 원본 파일을 백업 해야 -i '.bak'합니다 .sed.bak

명시적 루핑을 사용한 대안(하위 간격 ksh93또는 bash구문 허용 zsh):

for (( i = 0; i < 100; ++i )); do
  f="$( printf "file%02d" "$i" )"
  sed -i '.bak' '1,10d' "$f"
done

ksh93또는 를 zsh다른 방법으로 사용 :

typeset -Z 2 j
for (( i = 0; i < 100; ++i )); do
  j=$i
  sed -i '.bak' '1,10d' "file$j"
done

0으로 채워진 너비 2의 숫자로 캐스팅 typeset -Z 2 j됩니다 . 100에 도달하면 값이 100이 되어 루프가 무한 루프로 바뀌기 때문에 이런 방식 $j을 원하지 않습니다 . 이것은 형식화에 제출하기 전에 분명히 값을 사용하기 때문에 처리할 수 있을 것으로 보이는 것 입니다 .typeset i00ksh93zsh

답변3

임시 파일을 생성하거나 파일 권한, 소유권 또는 기타 속성에 영향을 주지 않으려면 다음을 사용하세요 ksh93.

for f in file{2}([0-9]); do
  tail -n +11 < "$f" 1<>; "$f"
done

리디렉션 <>;연산자는 유사하게 작동합니다 <>(읽기+쓰기 모드로 열림). 단, 명령이 성공적으로 종료되면 쉘이 명령이 중단된 파일을 자릅니다.

따라서 기본적으로 파일 자체를 덮어쓰는 것입니다.

답변4

Bash 루프를 선호하는 경우:

for f in file[0-9][0-9]; do
    tail -n +11 "$f" > tmp &&
    mv -f tmp "$f"
done

관련 정보