名前が2行のファイルがあるとしましょう。ファイル.txt:
Row 1: 80 is a nice number
Row 2: 80 is a cool number
Row 3: 80 is a piquant number
Row 4: 80 is a sexy number
私はこれをしましたが、sed -i 's/80/8080/g'
誤って2回実行し、すべての行の結果80808080
は8080
。
sed
おそらく一般的な技術では不可能だと思いますが、ファイルに一度だけ影響を与えるための洗練された方法があるかどうか尋ねたいと思います。私はsed
、ロックを削除するまでファイル内でこれを何度も実行するなどのエラーを回避するための一種の「ロック」を意味します。これは長い行、特に多数の行を処理するのに役立ちます(「おそらく」という言葉を強調します)。
このようなエラーを避ける必要があるのは実際には質問ではなく、それがすべてです。しかし、このようなエラーを避けるために技術的な「防御メカニズム」を開発しようとした人がいるかどうか疑問に思いますsed
。
awk
注:同様の解決策がユーザーにも役立つと思います。
答え1
これはあまり複雑ではありませんが、文字列を自分自身を含む文字列に置き換えるときに繰り返される置換を防ぐために、前および/または次の文字が追加される防御メカニズムです。
上記の例に基づいて、次のいずれか(またはその両方)をお勧めします。
sed -i 's/ 80 / 8080 /g'
sed -i 's/^80 /8080 /g'
また注意してください-i
:)
答え2
-i
特に何かを試してみたり、いくつかのスクリプトを開発している場合は、内部編集には使用しないでください。代わりに、一時ファイルが常に記録されます。次に、ファイルが正しいことを確認し、元のファイルをそのファイルに置き換えます。
この-i
オプションは非標準であり、sed
実装間の移植性が非常に低いです。
ファイルを変更する移植可能な方法sed
は次のとおりです。
sed 'expression' file >newfile && mv newfile file
awk
同じ問題はありません。awk
GNUはすべて内部編集(実際に人々が頻繁にやりたいことではない)をサポートしていmawk
ないため、誤ってファイル内で同じスクリプトを2回実行する問題(そしてファイル編集の「効果」が2倍になるという問題)は最小化になります。現れる。nawk
awk
awk