如何替换文本文件中包含“\n”的文本序列

How to replace a text sequence that includes "\n" in a text file

这听起来可能是重复的,但我做不到。

考虑:

_ = space
- = 减号

particle_little.csv 是这种形式的文件:

waste line to be deleted
__data__data__data
_-data__data_-data
__data_-data__data

我需要在 particle_std.csv 中获取 标准的 csv 格式,如下所示:

data,data,data
-data,data,-data
data,-data,data

我正在尝试使用tailtr进行转换,这里我拆分命令:

  1. tail -n +2 particle_little.csv删除第一行
  2. | tr -s ' ' 删除重复的 spaces
  3. | tr '/\b\n \b/' '\n'删除最开始的space
  4. | tr ' ' ',' 将 spaces 更改为逗号
  5. > particle_std.csv 将其放入输出文件

但是我明白了(没有第 4 步):

data
data
data
-data
...

最后,文件很大,用编辑器打开几乎不可能(我知道有超级编辑器也许可以)

您可能应该为此使用 sedawk

sed -e 1d -e 's/^  *//' -e 's/  */,/g'

在 Awk 中执行此操作的一种方法是:

awk 'NR == 1 { next }
     { pad=""; for (i = 1; i <= NF; i++) { printf "%s%s", pad, $i; pad="," } print "" }'

但在 Awk 中有更好的方法:

awk 'BEGIN { OFS=","} NR == 1 { next } {  = ; print }' data

BEGIN块设置输出字段分隔符;赋值 = ; 强制 Awk 修改输出行; print 打印它。

我保留了第一个 Awk 版本,因为它表明有不止一种方法可以做到这一点,而且在某些情况下,这些方法可能很有用。但是对于这个任务,第二个 Awk 版本更好——更简单、更紧凑(并且与 Tom Fenech's 同构)。

我建议你使用 awk:

$ cat file
waste line to be deleted
  data  data  data
 -data  data -data
  data -data  data
$ awk -v OFS=, '{  =  } NR > 1' file
data,data,data
-data,data,-data
data,-data,data

脚本将输出字段分隔符 OFS 设置为 , 并将第一个字段重新分配给它自己 = ,导致 awk 接触每一行(并用逗号替换空格) .第一行之后的行 NR > 1 被打印(默认操作是打印该行)。

因此,如果我没看错 - 忽略 以空格开头的行。逗号分隔其他所有内容。

我建议 perl:

perl -lane 'next unless /^\s/; print join ",", @F'; 

这个,当给定的时候:

waste line to be deleted
  data  data  data
 -data  data -data
  data -data  data

On STDIN(或在文件名中指定)输出:

data,data,data
-data,data,-data
data,-data,data

这是因为:

-l 去除换行符(并在每个 print 之后替换它们);

-a 自动拆分任何空格

-n 将其包装在一个 while ( <> ) { 循环中,该循环逐行迭代 - 从功能上讲,它的工作方式与 sed/grep/tr 相同并读取 STDIN 或指定为参数的文件。

-e 允许指定一个 perl 片段。

在这种情况下:

  • 跳过任何不以 \s 或任何空格开头的行。
  • 任何其他行,以 , 作为分隔符加入字段(@F-a 生成)。 (这会自动插入一个换行符,因为 -l

然后您可以将输出重定向到文件 (>output.csv) 或使用 -i.bak 就地编辑。