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)
是否有任何命令可以执行此操作?
我猜这个问题与那个问题有关,对吗?
在这种情况下,用换行符替换“^@”不是更值得吗?在下面,我猜你的意思是“^@”,即 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 ( $_) 中的默认标量变量是函数(以及其他)的默认参数。splitforeach循环打印每个元素@a(再次注意循环$_的默认迭代器是如何的foreach)。由于我们已将输出记录分隔符设置为八进制000,因此我们像以前一样得到由 NUL 字节分隔的结果。| 归档时间: |
|
| 查看次数: |
1393 次 |
| 最近记录: |