【问题标题】:Concatenate txt file contents and/or add break to all连接 txt 文件内容和/或为所有内容添加中断
【发布时间】:2012-02-15 07:37:51
【问题描述】:

我有一堆 .txt 文件需要制作成一个大文件,以便 Microsoft Excel 等程序可以读取。

问题是文件目前在它们的末尾没有中断,所以它们以一长行结束。

这是我所拥有的一个示例(数字代表行号):

1. | first line of txt file
2. | second line

我想把它变成这样:

1. | first line of txt file
2. | second line
3. | 

我在一个文件夹中有大约 3000 个这样的文件,所有文件都采用相同的格式。有没有办法获取这些文件并在它们的末尾添加一个空行?我想这样做而不需要复杂的代码,即 PHP 等。我知道你可以使用终端做类似的事情(我在 CentOS 上),但如果有什么特别是我需要的我'我想念它。

【问题讨论】:

  • 您的格式令人困惑-您说它是一行,但随后显示了一个多行示例。另外,您是否为此尝试过正则表达式?

标签: append centos concatenation text-files


【解决方案1】:

实现这一点的最简单方法是使用 bash for 循环:

for file in *.txt; do
    echo >> "$file"
done

这会遍历当前目录中的所有.txt 文件,并在每个文件中添加一个换行符。可以写成一行,只需要在done前加一个;即可。

请注意,$file 被引用以处理名称中包含空格和其他有趣字符的文件。

如果文件分布在多个目录中而不是全部在同一个目录中,您可以将*.txt 替换为**/*.txt 以遍历当前文件夹所有子目录中的所有.txt 文件。


另一种方法是使用sed:

sed -i "$ s:$:\n:" *.txt

-i 标志告诉sed 就地编辑文件。 $ 匹配最后一行,然后s 命令用新行($)替换行尾(同样是$),从而在文件末尾追加一行。

【讨论】:

    【解决方案2】:

    试试这个 sn-p:

    for f in *; do ((cat $f && echo "") > $f.tmp) done && rename -f 's/\.tmp$//' *.tmp
    
    • 这基本上需要文件夹中的任何文件 (for f in *; do)。
    • 在 STDOUT (cat $f) 上输出文件,后跟换行符 (echo "")
    • 并将输出重定向到 filename.tmp (> $f.tmp)
    • 然后将 *.tmp 文件移动到原始文件 (rename -f 's/\.tmp$//' *.tmp)。

    编辑: 甚至更简单:

    for f in *; do (echo "" >> $f) done
    
    • 这基本上获取文件夹中的任何文件 (for f in *; do)。
    • 输出换行符 (echo "")
    • 并将其附加到文件中 (>> $f)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多