각 단락이 자체 파일이 되도록 텍스트 파일을 분할하는 방법은 무엇입니까?

각 단락이 자체 파일이 되도록 텍스트 파일을 분할하는 방법은 무엇입니까?

매우 긴 URL 목록이 있고 각 단락(줄 바꿈으로 구분)을 자체 파일로 분할하는 쉘 스크립트를 만들려고 합니다. 파일에 번호가 필요합니다.

001 002 003...

등. 내가 시도한 것은 다음과 같습니다.

    #!/bin/zsh

    # Jakaa pitkä tiedoston kappaleet erilisiin tiedostoihin
    # Ei toimi.

    i=1
    while read p; do
        if [[ "$p" == "k" ]]; then
            i=$((i + 1))
            continue
        fi
        if (( $i < 10 )); then
            printf '%s\n' "$p" | tee -a kuvat_vol00"$i"
        elif (( $i > 9 )) && (( $i < 100 )); then
            printf '%s\n' "$p" | tee -a kuvat_vol0"$i"
        elif (( $i > 99 )); then
            printf '%s\n' "$p" | tee -a kuvat_vol"$i"
        fi
    done

저는 개행 문자를 구분 기호로 사용하는 방법을 몰랐기 때문에 문자 "k"를 대신 사용했습니다. 아마 바보일지도 모르지, 나도 알아...

이 스크립트는 다음과 같이 만든 테스트 파일에서 작동합니다.

123
k
123
k
sdfsdf
k
k
something

이것은 나에게 준다쿠와트_001그리고쿠와트_002그리고"123"그리고쿠와트_003그리고"sdfsdf"등. 하지만 URL을 사용하려고 하면 모든 내용이 파일로 인쇄됩니다.쿠와트_001. 나는 이것이 URL의 슬래시 및 기타 흥미로운 문자와 관련이 있다고 생각합니다. 쉘이 특수 문자를 특수 문자로 해석하지 않도록 만드는 방법은 무엇입니까? 아니면 vim 등에서 직접 awk나 script를 사용해야 합니까? 나는 무엇을 해야할지 모르겠습니다.

이런 멍청한 질문을 드리기가 조금 부끄럽지만, 이 문제로 3일 정도 씨름을 했는데 도무지 이해가 되지 않습니다. 나는 쉘 스크립팅에 전혀 능숙하지 못하다는 것을 알고 있습니다. 그러나 어떤 이유에서인지 컴퓨터를 올바르게 사용하는 방법을 배울 수 있어서 기쁩니다. 네, 도움을 주시면 감사하겠습니다!

편집: 내 입력 파일의 시작 부분은 다음과 같습니다. 이것이 문제가 될 수 있습니까?

https://2.bp.blogspot.com/l3Sk4TIKuKgEji-IJbxA7LetcDqWGbosjx-wSH8omLyNj4b1hq-Cs1wtFxd88XASw-FiJjjFSNbO=s1600
https://2.bp.blogspot.com/9GUUQ1HaC6m-4LbMKOZ7JLj55SqMfam9SHD6J48ezjGNY_hy8YUYYybhip_LKgYr9pKEI140Ewug=s1600
https://2.bp.blogspot.com/LYVJuq-I5kmAQUfLd_Kk28rJu1sOdo3md0ANHgS5w_wIVSIHSrwJAgO_MNm9DFg7GahrSYo4MFIp=s1600
https://2.bp.blogspot.com/qBITOIAnC09jmA-KDrFRyD3yGK_-2kNRyfr-AAJlitKTR8R7qzy8Q6v_1ukwZVBmIT8hBSRyinJE=s1600

https://2.bp.blogspot.com/9dwLT4h1pDRoOf0Mmp76zy04UGzPVEVTChNdTHAfqDPsb5fSSB2Tf4hFlFivNqPgplwKvdoEYNR0=s1600
https://2.bp.blogspot.com/D-9yBu7Zzg65mnfO2DuyU4aBcF9kAgllCJPpFuRKDrN5qUiuwJ9U-ReMhBg8b0Grg4PdcHlcmh2Y=s1600
https://2.bp.blogspot.com/RAUJka1fyc5yQAwh_O9bmqKj0vXgFvM9QvuIcKkItkxQiNFGgU1WUSBNqUQIGnnNpZaSzPHCyd8N=s1600

답변1

이는 다양한 도구를 사용하여 수행할 수 있습니다. 단락 개념이 있기 때문에 awk를 사용하겠습니다.

awk '
   BEGIN { RS="" }
   { F=sprintf("kuvat_%03d", NR) ; print > F ; close(F) }' input_file_name

단락 모드를 활성화하려면 RS 변수를 빈 문자열로 설정하세요. 각 기록(단락)에 대해 올바른 이름의 파일로 인쇄하고 파일을 닫습니다.

답변2

현실적인 GNU csplit:

  $ csplit \
      --suppress-matched -s \
       -f kuvat_vol_ -b %03d \
        file '/^$/' '{*}'  \
  ;

사용 Perl:

$ perl -l -00pe '
    close F if $i;
    open F, ">", sprintf "kuvat_vol_%03d", $i++;
    select F;
 ' file 

관련 정보