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 ( $_
) 中的默认标量变量是函数(以及其他)的默认参数。split
foreach
循环打印每个元素@a
(再次注意循环$_
的默认迭代器是如何的foreach
)。由于我们已将输出记录分隔符设置为八进制000
,因此我们像以前一样得到由 NUL 字节分隔的结果。