我使用 awk 更改文件中的行
export textContent="verylongtextmorethan4K"
awk '{ if (NR == 200) print "${textContent}\"; else print $0}' a.txt > b.txt
但如果行文本长度超过 2K,则它将不起作用。我意识到这是因为要插入的文本很长。我该如何解决这个问题,将4K长文本插入一行。
答案1
使用perl,它被设计为没有这样的限制。
#!/usr/bin/perl
while (<>) {
if ($. == 200) {
print $ENV{'textContent'}, "\n";
}
else {
print;
}
}
或者简短的“oneliner”版本:
#!/usr/bin/perl
while (<>) { print ($. == 200) ? ($ENV{'textContent'} . "\n") : $_; }
将perl脚本保存在eg中x.pl
,然后运行
perl x.pl a.txt > b.txt
或者首先使脚本可执行:
chmod +x x.pl
./x.pl a.txt > b.txt
<>
返回输入的下一行,在 EOF 处返回 false,因此循环终止。
$.
是 perl 的特殊变量,包含当前输入行号。
print
由于 perl 不会自动向作为参数传递的内容添加换行符,因此我添加了"\n"
.在第一个版本中,print
环境变量的内容和换行符作为列表传递;因此使用逗号。在第二个版本中,它们被连接在一起,因为三元运算符 ( ?
:
) 期望那里有一个值而不是一个列表。
也许您对三元运算符不熟悉。它采用以下形式:
condition ? value1 : value2
如果条件为真,则value1
返回,否则返回value2
。所以这里,如果行号是200,那么就返回很长的一行,否则$_
就是当前记录(即行)的内容。