awkを使用してファイルの行を変更します。
export textContent="verylongtextmorethan4K"
awk '{ if (NR == 200) print "${textContent}\"; else print $0}' a.txt > b.txt
ただし、行テキストの長さが2Kを超えると機能しません。挿入されるテキストが長すぎるために気づきました。 4K長いテキストを1行に挿入するには、この問題をどのように解決する必要がありますか?
答え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スクリプトを保存し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
環境変数の内容と改行がリストに渡されたため、コンマが使用されました。 2番目のバージョンでは、三項演算子(?
:
)がリストではなく値を期待しているため、一緒にリンクされています。
たぶんあなたは三項演算子に慣れていないかもしれません。次の形式を取ります。
condition ? value1 : value2
条件がtrueの場合はを返し、そうでない場合はをvalue1
返しますvalue2
。したがって、ここで行番号が200の場合は非常に長い行が返され、それ以外の場合は$_
現在のレコード(つまり行)の内容が返されます。