ファイルの最後のn行をどのように編集しますか?

ファイルの最後のn行をどのように編集しますか?

ファイルの最後のn行を編集するためのコマンドはありますか?行数が異なる複数のファイルがあります。しかし、各ファイルの最後のn行を修正したいと思います。目標は、最後のn行のカンマをセミコロンに置き換えることです。しかし、最後のn行にのみ適用されます。

どの行も削除したくないので、各ファイルの最後のn行で各コンマをセミコロンに置き換えたいと思います。

sedコマンドを使用すると、最後の行をこのコマンドで置き換えることができます。ここで説明されているように: ファイルの最後のテキスト行を削除する方法は?

ただし、これにより、最後のn行ではなく最後の行のみを変更できます。

答え1

最後のn行のカンマをセミコロンに置き換えるには、次のようにしますed

n=3
ed -s input <<< '$-'$((n-1))$',$s/,/;/g\nwq'

分離してください:

  • ed -s= edを自動的に実行します(最後に書き込まれたバイトを報告しません)。
  • '$-'=ファイルの末尾から減算($)...
  • $((n-1))= n-1行...
  • $' ... '=シェルから保護するためにコマンドの残りの部分を引用します)
  • ,$s/,/;/g= ...ファイルの最後まで(,$)まですべてのコンマを検索してセミコロンに置き換えます。
  • \nwq=前のコマンドを終了して保存して終了します。

最後のn行のカンマをセミコロンに置き換えるには、次のようにしますsed

n=3
sed -i "$(( $(wc -l < input) - n + 1)),\$s/,/;/g" input

分割:

  • -i=ファイルを「所定の位置に」編集する
  • $(( ... ))=数学を見てください:
  • $( wc -l < input)= ファイルの行数を取得します。
  • -n + 1= n-1行後ろに移動
  • ,\$=行n-1からファイルの終わりまで:
  • s/,/;/g=カンマをセミコロンに置き換えます。

答え2

tacそして、以下を使用してsedfile.txtの最後の50行にあるすべてのコンマをセミコロンに置き換えるソリューション:

tac file.txt | sed '1,50s/,/;/g' | tac

答え3

GNUheadやBourneに似たシェルを使う:

n=20
{ head -n -"$n"; tr , ';'; } < file 1<> file

ファイル自体を上書きしています。バイト単位で音訳する場合は1<> file大丈夫ですが、変更によってファイルサイズが変更される場合には必ずしもそうではありません(たとえばに置き換える必要がある場合)。> other-file && mv other-file file

答え4

tailsedに使用し、パイプ:

tail -n 20 file | sed 's/,/;/g'

これはファイルの最後の20行に適用されます。ファイルに直接アクセスするには:

tail -n 20 file | sed -i 's/,/;/g'

関連情報