sed
とawk
なしで、内容を別のファイルに書き込まずにファイルを変更する方法はありますか?
例えば:
$ cat test.txt
aaa
aaa
bbb
ccc
ddd
sed
を-i
オプションで置き換えると、sed -i 's/aaa/NNN/g' test.txt
は次のようになります。
NNN
NNN
bbb
ccc
ddd
awk
とsed
なしでそれを行うには?
vi
スクリプトを使用できます。
$ vi test.txt -c '%s/aaa/NNN/ | wq'
$ cat test.txt
NNN
NNN
bbb
ccc
ddd
コマンドモードでvi
を使用するときに通常入力される内容を自動化しているだけです( Esc: 通常):
%
-すべての行で次のコマンドを実行します。
s/aaa/NNN/
-aaa
をNNN
で代用
|
-コマンド区切り文字
w
-変更をファイルに書き込みます
q
-終了
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
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
bash
またはksh
を使用している場合は、シェル変数のパターン置換を使用できます。ただし、基本的なシェルグロブはそれほど強力ではなく、拡張シェルグロブにはsedにはない機能がいくつかあり、その逆も同様です。詳細については、man 1 bash
の「パラメータ拡張」を参照してください。
t=$(< test.txt); printf '%s\n' "${t//aaa/NNN}" >test.txt
拡張シェルグロブはデフォルトで無効になっているため、明示的に有効にする必要がある場合があります。
shopt -s extglob
Perlを使用することもできます
Perl -pi -e 's/aaa/bbb/g' file.txt
これにより、希望する出力が得られます。
i
の代わりにi.bak
を使用して、元のファイルを自動的にバックアップすることもできます。これにより、file.txt.bakという名前のバックアップが作成されます。
VimはExモードで使用できます。
ex -sc '%s/aaa/NNN/|x' test.txt
%
すべての行を選択
s
代替
x
保存して閉じる