使用bash,如何在文本文件中每隔多个字符添加特定文本?

时间:2014-09-12 03:10:20

标签: bash

我有一个文本文件,我需要添加$ LINE,然后是分页符。例如,在

的文本文件中
  

这是一个随机的文本文件,我坐在这里,我只是为了这个例子而写作填充空间。这篇文章的内容是无关紧要的,只是为了证明我所问的问题的含义。再一次,我只是写作填补空间。

我想把它变成

  

$ LINE这是一个随机的文本文件,我坐在这里,我只是为了这个例子而写作填充空间。

     

$ LINE此文字的内容无关紧要

     

$ LINE,只是为了证明我问的问题的含义。

     

$ LINE再一次,我只是写作填补空间。

鉴于在断开下一个$ LINE之前每个$ LINE后面跟着正好175个字符的文本,那么以我描述的方式拆分整个文本文件的最佳方法是什么?

3 个答案:

答案 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}}