我有一个文本文件,我需要添加$ LINE,然后是分页符。例如,在
的文本文件中这是一个随机的文本文件,我坐在这里,我只是为了这个例子而写作填充空间。这篇文章的内容是无关紧要的,只是为了证明我所问的问题的含义。再一次,我只是写作填补空间。
我想把它变成
$ LINE这是一个随机的文本文件,我坐在这里,我只是为了这个例子而写作填充空间。
$ LINE此文字的内容无关紧要
$ LINE,只是为了证明我问的问题的含义。
$ LINE再一次,我只是写作填补空间。
鉴于在断开下一个$ LINE之前每个$ LINE后面跟着正好175个字符的文本,那么以我描述的方式拆分整个文本文件的最佳方法是什么?
答案 0 :(得分:2)
如果您不需要正确处理带有NUL字符的文件,可以使用read
将每个段收集到缓冲区中,然后printf
发出该缓冲区和添加的字符:
size=175 # number of bytes per section; tune to fit
interspaced_char=$'\n\n' # character(s) to intersperse; likewise
while REPLY=; IFS= read -r -d '' -n "$size" || [[ $REPLY ]]; do
printf '%s' "$REPLY"
(( ${#REPLY} == $size )) && printf '%s' "$interspaced_char"
done <input >output
允许循环在read
返回非零退出状态时继续,但$REPLY
在执行后非空,允许在输入文件末尾进行部分读取。
如果做需要处理NUL字符,最好的办法是使用带有Pascal样式字符串的编程语言(如Python)而不是NUL终止字符串(由bash使用) ;表示包含NUL的字符串在bash中是可能的(通过使用数组),但这会增加非常重要的复杂性。
答案 1 :(得分:2)
sed -e 's/\(.\{175\}\)/\1\n\n/g' /path/do/file.txt > /path/do/new_file.txt
答案 2 :(得分:1)
提供了许多优秀的解决方案。另外一个考虑因素是,您是否希望在单词边界(单词的末尾)发生中断,或者只是在确切的字符上发生中断时将任意单词分成两部分。在Deep的sed
解决方案之后,这是一个小的补充,导致在当前单词结尾处发生中断。一般来说,这将增加0-10个额外的字符:
sed -e 's/\(.\{175\}[^ ]*\s\)/\1\n/g' /path/do/file.txt > /path/do/new_file.txt
有时整个单词都是可取的。 (双倍间距也被删除。如果需要,只需在表达式中添加\n
并添加{{1}}