web-dev-qa-db-ja.com

別のファイルを作成せずにファイルを変更する

sedawkなしで、内容を別のファイルに書き込まずにファイルを変更する方法はありますか?

例えば:

$ cat test.txt
aaa
aaa
bbb
ccc
ddd

sed-iオプションで置き換えると、sed -i 's/aaa/NNN/g' test.txtは次のようになります。

NNN
NNN
bbb
ccc
ddd

awksedなしでそれを行うには?

10
Prakki Rama

viスクリプトを使用できます。

$ vi test.txt -c '%s/aaa/NNN/ | wq'
$ cat test.txt
NNN
NNN
bbb
ccc
ddd

コマンドモードでviを使用するときに通常入力される内容を自動化しているだけです( Esc: 通常):

%-すべての行で次のコマンドを実行します。

s/aaa/NNN/-aaaNNNで代用

|-コマンド区切り文字

w-変更をファイルに書き込みます

q-終了

18
garethTheRed

sponge の使用:

#!/bin/bash

pattern='aaa'
replacement='NNN'

while read -r line
do                                                                              
  printf '%s\n' "${line//$pattern/$replacement}"
done < "${1}"

次の電話番号:

./script.sh test.txt | sponge test.txt
14
Sebastian

ed を使用すると、行エディターは次のようになります。

ed -s test.txt <<< $',s/pattern/replace/g\nw\nq'

または

ed -s test.txt <<IN
,s/pattern/replace/g
w
q
IN

または

printf '%s\n' ,s/pattern/replace/g w q | ed -s test.txt
12
don_crissti

bashまたはkshを使用している場合は、シェル変数のパターン置換を使用できます。ただし、基本的なシェルグロブはそれほど強力ではなく、拡張シェルグロブにはsedにはない機能がいくつかあり、その逆も同様です。詳細については、man 1 bashの「パラメータ拡張」を参照してください。

t=$(< test.txt); printf '%s\n' "${t//aaa/NNN}" >test.txt

拡張シェルグロブはデフォルトで無効になっているため、明示的に有効にする必要がある場合があります。

shopt -s extglob
5
Franki

Perlを使用することもできます

Perl -pi -e 's/aaa/bbb/g' file.txt

これにより、希望する出力が得られます。

iの代わりにi.bakを使用して、元のファイルを自動的にバックアップすることもできます。これにより、file.txt.bakという名前のバックアップが作成されます。

4
One Face

VimはExモードで使用できます。

ex -sc '%s/aaa/NNN/|x' test.txt
  1. %すべての行を選択

  2. s代替

  3. x保存して閉じる

2
Steven Penny