在linux中拆分文件的内容

Man*_*ano 5 text-processing files

我有一个文本文件,其内容如下:

abc.tar^@xxx.tar^@yyy.tar^@ 
Run Code Online (Sandbox Code Playgroud)

例如,我在一个名为的文件中包含此内容,abc.txt我想拆分内容并将前两个条目写入一个新文件。

(例如),新文件看起来像这样:

abc.tar^@xxx.tar^@
Run Code Online (Sandbox Code Playgroud)

是否有任何命令可以执行此操作?

Jos*_* R. 0

我猜这个问题与那个问题有关,对吗?

在这种情况下,用换行符替换“^@”不是更值得吗?在下面,我猜你的意思是“^@”,即 ASCII NUL 字节:

$ sed 's/\o000/\n/g' abc.txt | head -n 2
abc.tar
xxx.tar
Run Code Online (Sandbox Code Playgroud)

所以你需要

sed 's/\o000/\n/g' abc.txt | head -n 2 > newfile.txt
Run Code Online (Sandbox Code Playgroud)

解释

这会用换行符 ( \n) 替换每个 NUL 字节 ( \o000),这\o意味着接下来是八进制表示法中的一个字节。然后将输出通过管道传送到head -n 2提取前两行;结果行被重定向 ( >) 到文件newfile.txt

但是,如果文件名用“^@”分隔对您来说很重要,则可以使用:

perl -nl000 -e '
    $num_lines =2 ;
    push @a,(split /\000/)[0..$num_lines-1];
    print $_ for @a' abc.txt > newfile.txt
Run Code Online (Sandbox Code Playgroud)

根据需要替换上面的值以从文件中$num_lines获取第一行。$num_lines

解释

  • -n开关指示perl在输入文件的每一行上运行代码
  • -l000序列指示perl将输出记录分隔符(每个字符串后打印的字符)设置为 NUL 字节 ( 000)。
  • -e开关表明perl后面的字符串是要执行的代码。
  • split函数以 NUL 字节作为分隔符分割每个输入行,取出第一个$num_lines( [0..$num_lines-1]) 结果并将它们放入数组中@a。请注意,函数调用中没有指定“当前输入行”部分。这利用了这样一个事实:当没有提供参数时, Perl ( $_) 中的默认标量变量是函数(以及其他)的默认参数。split
  • 最后的foreach循环打印每个元素@a(再次注意循环$_的默认迭代器是如何的foreach)。由于我们已将输出记录分隔符设置为八进制000,因此我们像以前一样得到由 NUL 字节分隔的结果。