ターミナルのみを使用してプログラムでファイルを編集する方法は?


13

コマンドからファイルを読み取り、手動で介入することなくファイルを編集できるシェルスクリプトを作成したい(テキストを検索して別のテキストに置き換える)。

このためにテキストエディタを使用する必要はありません...単にテキスト検索(grepを使用するなど)し、それを他のテキストに置き換えて変更を保存します。

回答:


10

そこsedから遊び始めます。sedコマンドはこの形式になります。

[pattern1][,pattern2][!] command [args]

正規表現を使用しているため、少し難しくなる場合があります。以下の2番目のリンクから抜粋したいくつかの基本的な例:

#各行で「foo」を「bar」に置換(検索および置換)
sed 's / foo / bar /'#行の最初のインスタンスのみを置き換えます
sed 's / foo / bar / 4'#行の4番目のインスタンスのみを置換
sed 's / foo / bar / g'#行のすべてのインスタンスを置換
sed 's / \(。* \)foo \(。* foo \)/ \ 1bar \ 2 /'#最後から2番目のケースを置換
sed 's / \(。* \)foo / \ 1bar /'#最後のケースのみを置換

#「baz」を含む行のみ「foo」を「bar」に置換
sed '/ baz / s / foo / bar / g'

#「baz」を含む行を除き、「foo」を「bar」に置換
sed '/ baz /!s / foo / bar / g'

#「スカーレット」または「ルビー」または「プース」を「赤」に変更
sed 's / scarlet / red / g; s / ruby​​ / red / g; s / puce / red / g'#ほとんどのsed
gsed 's / scarlet \ | ruby​​ \ | puce / red / g'#GNU sedのみ

いくつかの参照


7

非常に遅い答え。ただし、これは同様の問題/疑問を持つ他の人を助けるかもしれません。

パッチを作成して適用することをお勧めします。良い例が ここにあります

たとえば、new.txtファイルに、old.txtに適用する変更が含まれているとします。端末でコマンドを実行するか、patch_file.shを作成して実行することができます。

コマンドライン:ターミナルを開き、以下の行をコピーして実行します(必要に応じてファイル名を変更します):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

スクリプト:.shファイルアプローチを使用します。ターミナル内(キーボード:ctrl + alt + t: gedit patch_file.sh

以下に示すように、ターミナルで使用するコマンドをコピーして、.shファイルのヘッダーの下に貼り付けます(gedit)。

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

スクリプトを実行可能にします(端末):

chmod +x patch_file.sh

スクリプト(端末)を実行します。

./patch_file.sh # may require sudo access depending on the directory affected

+1パッチは、中程度から重度の、または複雑な修正の場合、常にまっすぐな方法です。なぜ正規表現ツールを使用してすべてのことをしようとする人もいます。
user.dz

テストしたファイルに必要な変更を適用するように見える正規表現をリバースエンジニアリングするよりもはるかに優れていますが、そのファイルの他のインスタンスに適用すると、他の効果が得られる場合があります。
-bigjosh

特定のテキスト文字列のすべてのインスタンスを置き換える場合、つまり、すべての「」を「_」、すべての「マイナス」を「-」、すべての「gb | <string_of_numbers> | ARO:」を「 ARO: "?ありがとう。
ジョシュ

1

ファイルを編集する場合は、ファイルエディターを使用します。exedなどのスクリプトから使用できるコマンドベースのファイルエディターがあります。


1

sedまたはawkを探しています。sedはよりシンプルで、awkはより強力であると思います。

別の質問の例を次に示します。

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

これの意味は:

  • ファイルで検索 /usr/share/applications/defaults.list
  • Find / grep gedit.desktop
  • と置換する yournew.desktop
  • 変更を適所に適用する -i

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