我有一个很长的网址列表,我正在尝试制作一个 shell 脚本来将每个段落(以换行符分隔)分割成自己的文件。文件需要编号
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。我认为这与网址中的斜杠和其他有趣的字符有关。如何使 shell 不将特殊字符解释为特殊字符?或者我应该使用 awk 或直接在 vim 中编写脚本或其他什么?我只是不知道该怎么做。
我有点羞于问这么愚蠢的问题,但我已经为此苦苦挣扎了大约三天,但我无法弄清楚。我知道,我完全不擅长 shell 脚本编写,但出于某种原因,我很高兴能够学习正确使用计算机。所以,是的,我很感谢您能给我的任何帮助!
编辑:我的输入文件的开头如下所示。这会是一个问题吗?
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