파일 이름은 (백개 파일) 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' {} \;
작동 방식:
-i.bak
sed에게 파일을 수정하고 .bak 확장자를 가진 백업 파일을 생성하도록 지시합니다.-n
명시적으로 요청하지 않는 한 어떤 줄도 인쇄하지 않도록 sed에 지시합니다.11,$p
$
sed에게 라인 11에서 시작하여 파일의 마지막 라인으로 끝나는 라인을 인쇄하도록 지시합니다 ( 로 표시됨).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
i
00
ksh93
zsh
답변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