単一のコマンドで複数のテキストファイルを編集する方法


18

複数のテキストファイルの最初の行を削除し、別の行に置き換えたい。ターミナルを使用してこれを行う方法はありますか?

vimの使用方法は知っていますが、vimで自動化する方法はありますか?(各ファイルを個別に編集する場合のように)手動で行うことは避けたいです。

可能であれば、新しいライブラリのインストールを避けたいと思います(特に私が非常にシンプルだと思うようなもののために-しかし、私は間違っているかもしれません)。

前もって感謝します!

回答:


21

以下を使用できますsed

sed -i.bak '1s/^.*$/new line/' *.txt

これ.txtにより、現在のディレクトリ内のすべてのファイルの最初の行がtext new lineに置き換えられ、必要に応じて変更します。

また、元のファイルは.bak拡張子を付けてバックアップされます。それを使用したくない場合は、

sed -i '1s/^.*$/new line/' *.txt

ありがとうございました!sed実際に私が探していたものです!
-TomTsagk

@TomTsagkうれしい:)
heemayl

11

さて、vim自分自身を使用して:

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

これが何をするか:

  • setline (n, text)まあ、これはline nをに設定する関数ですtext
  • call 関数を呼び出すために必要です。
  • bufdo バッファー間でコマンドを繰り返すために使用されます(範囲なしで、すべてのバッファーに作用します)。
  • wqバッファを保存して終了します。次のバッファに移動する前にこれを行う必要があるため、このコマンドはcallを使用してコマンドにチェーンされ|ます。
  • -c cmdrun cmdは、最初のバッファーを読み込んだ後のコマンドモードコマンドです。
  • Nes 互換性のない、サイレント、元モードをオンにします。これは、非対話型処理に適しています。

利点:

  • setline-テキストコンテンツは、何もすることができます&でのsed置換テキストは、意図しない影響を持つことができます。

sedはるかに使いやすいようvimですが、同じことができるのは本当に素晴らしいです!答えてくれてありがとう!
-TomTsagk

@TomTsagkは、複数のファイル間でどのように行動できるかを説明したかっただけです(bufdo)。あなたがすでに開いているファイルを持つと...とに交互に表示するように考えてみましょう1s/foo/bar/
ムル

素晴らしい!!! <3_ <3
カンパ

3

他のいくつかのオプション:

  • awk(GNUの比較的新しいバージョンが必要ですawk

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Perl /シェル

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • シェル/コアユーティリティ

    $ for f in *txt; do 
        ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; 
      done
    

2

このスクリプトは、元のファイルを実際に変更せずに、変更したファイルを新しいディレクトリに配置して、要求どおりに実行します。

d=/tmp/cooked
mkdir $d
for f in *  #will match all files in current directory; adjust as desired
do
  echo "This is the new 1st line" > /${d}/${f}
  sed 1d ${f} >> /${d}/${f}
done

私は答えるのが遅かった(コードをテストした)...そして、heemaylのソリューションがとても好きです!
チャールズボーリング

0

を使用して gawk

gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt 
1
2
3
4

% cat bar.txt 
1
2
3
4

% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt                                                    
your_replacement
2
3
4

% cat bar.txt                                                    
your_replacement
2
3
4

0

jEdit:大量の検索と置換に使用します。RegEx-正規表現を使用する機能を備えた強力なツールです。ディレクトリ内のファイルを操作したり、「。html」などのファイル拡張子を指定したりできます。また、GUIでコンテキストの変更候補のロケールを確認できます。jEditは素晴らしい。

jEditはUbuntuのソフトウェアセンターから入手できます。


0

tailおよびcatコマンドはこれを簡単に行います。

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

それらを適切なループでラップし、おそらくハードコードされた一時ファイル名の代わりに適切で正しい一時ファイルを使用します。bashやその他のシェルには、一時ファイルを作成するための構文があると思います。

tailの-nオプションには、引数にプラス記号があるかどうかに応じて2つの解釈があります。プラス記号がある場合、指定された行番号から始まるファイルの末尾を表示することを意味します。それ以外の場合、数値は、最後の行を含む行の数であり、その末尾が出力されることになっています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.