664

与えられた入力文字列を検索して置換し、ファイル内abcの別の文字列と置換する最も簡単な方法は何ですか?XYZ/tmp/file.txt

私はアプリを作成し、IronPython を使用して SSH 経由でコマンドを実行していますが、Unix についてはよくわからず、何を探すべきかわかりません。

Bash は、コマンド ライン インターフェイスであるだけでなく、非常に強力なスクリプト言語になる可能性があると聞いたことがあります。ですから、これが本当なら、このようなアクションを実行できると思います。

私の目標を達成するための最も簡単な (1 行の) スクリプトは何ですか?

4

17 に答える 17

1119

最も簡単な方法は、sed(またはperl)を使用することです。

sed -i -e 's/abc/XYZ/g' /tmp/file.txt

オプションにより、sedを呼び出してインプレース編集を実行し-iます。これはbashから呼び出すことができます。

本当にbashだけを使用したい場合は、次のように機能します。

while IFS='' read -r a; do
    echo "${a//abc/XYZ}"
done < /tmp/file.txt > /tmp/file.txt.t
mv /tmp/file.txt{.t,}

これは各行をループし、置換を実行し、一時ファイルに書き込みます(入力を壊したくない)。最後の移動は、一時的に元の名前に移動します。(堅牢性とセキュリティのために、一時ファイル名は静的または予測可能であってはなりませんが、そこには行きません。)

Macユーザーの場合:

sed -i '' 's/abc/XYZ/g' /tmp/file.txt(理由は以下のコメントを参照してください)

于 2009-02-08T12:20:29.707 に答える
177

ファイルの操作は通常Bashによって行われるのではなく、Bashによって呼び出されるプログラムによって行われます。例:

perl -pi -e 's/abc/XYZ/g' /tmp/file.txt

フラグは、-iインプレース交換を行うように指示します。

man perlrun元のファイルのバックアップを取る方法など、詳細についてはを参照してください。

于 2009-02-08T12:10:32.440 に答える
75

これにぶち当たった時はビックリした…

パッケージに同梱されているreplaceコマンドがある"mysql-server"ので、インストール済みの場合は試してみてください。

# replace string abc to XYZ in files
replace "abc" "XYZ" -- file.txt file2.txt file3.txt

# or pipe an echo to replace
echo "abcdef" |replace "abc" "XYZ"

詳細については、を参照してくださいman replace

于 2013-04-09T15:35:27.373 に答える
69

これは古い投稿ですが、@centurian が単一引用符は何も展開されないことを意味すると述べたように、変数を使用したい人にとっては.

変数を取得する簡単な方法は、文字列の連結を行うことです。これは、bash の並置によって行われるため、次のように動作するはずです。

sed -i -e "s/$var1/$var2/g" /tmp/file.txt
于 2015-12-07T12:48:56.783 に答える
43

Bashは、他のシェルと同様に、他のコマンドを調整するための単なるツールです。通常は標準のUNIXコマンドを使用しようとしますが、もちろんBashを使用して、独自のコンパイル済みプログラム、他のシェルスクリプト、PythonおよびPerlスクリプトなどを呼び出すことができます。

この場合、それを行うにはいくつかの方法があります。

ファイルを読み取り、別のファイルに書き込み、検索/置換を実行する場合は、sedを使用します。

    sed 's/abc/XYZ/g' <infile >outfile

ファイルをその場で編集する場合(エディターでファイルを開き、編集してから保存する場合のように)、ラインエディター'ex'に指示を入力します。

    echo "%s/abc/XYZ/g
    w
    q
    " | ex file

例はvi、フルスクリーンモードがない場合のようなものです。vi:プロンプトで行うのと同じコマンドを与えることができます。

于 2009-02-08T12:13:13.807 に答える
36

私はとりわけこのスレッドを見つけました、そして私はそれが最も完全な答えを含んでいることに同意します、それで私も私のものを追加しています:

  1. sedそしてedとても便利です...手で。@Johnnyからのこのコードを見てください:

    sed -i -e 's/abc/XYZ/g' /tmp/file.txt
    
  2. 私の制限がシェルスクリプトでそれを使用することであるとき、「abc」または「XYZ」の代わりに変数を内部で使用することはできません。BashFAQは、少なくとも私が理解していることに同意しているようです。だから、私は使用できません:

    x='abc'
    y='XYZ'
    sed -i -e 's/$x/$y/g' /tmp/file.txt
    #or,
    sed -i -e "s/$x/$y/g" /tmp/file.txt
    

    しかし、私たちは何ができますか?として、@ジョニーは使用すると言いましたwhile read...が、残念ながらそれは話の終わりではありません。以下は私とうまくいきました:

    #edit user's virtual domain
    result=
    #if nullglob is set then, unset it temporarily
    is_nullglob=$( shopt -s | egrep -i '*nullglob' )
    if [[ is_nullglob ]]; then
       shopt -u nullglob
    fi
    while IFS= read -r line; do
       line="${line//'<servername>'/$server}"
       line="${line//'<serveralias>'/$alias}"
       line="${line//'<user>'/$user}"
       line="${line//'<group>'/$group}"
       result="$result""$line"'\n'
    done < $tmp
    echo -e $result > $tmp
    #if nullglob was set then, re-enable it
    if [[ is_nullglob ]]; then
       shopt -s nullglob
    fi
    #move user's virtual domain to Apache 2 domain directory
    ......
    
  3. が設定されているかどうかを確認できるように、次のようにasをnullglob含む文字列がある場合は奇妙な動作をします。*

    <VirtualHost *:80>
     ServerName www.example.com
    

    これは

    <VirtualHost ServerName www.example.com
    

    終了山かっこはなく、Apache2はロードすらできません。

  4. この種の解析は、ワンヒット検索および置換よりも低速である必要がありますが、すでに見たように、1つの解析サイクルで機能する4つの異なる検索パターンに対して4つの変数があります。

問題の与えられた仮定で私が考えることができる最も適切な解決策。

于 2013-02-07T14:48:02.140 に答える
29

使用できますsed

sed -i 's/abc/XYZ/gi' /tmp/file.txt

ファイル名がわからない場合は、次findを使用できます。sed

find ./ -type f -exec sed -i 's/abc/XYZ/gi' {} \;

すべての Python ファイルを検索して置換します。

find ./ -iname "*.py" -type f -exec sed -i 's/abc/XYZ/gi' {} \;
于 2017-01-14T09:45:22.140 に答える
15

URL を「/」文字に置き換える場合は注意してください。

それを行う方法の例:

sed -i "s%http://domain.com%http://www.domain.com/folder/%g" "test.txt"

抜粋: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html

于 2015-07-27T19:08:59.727 に答える
12

ed次のコマンドを使用して、ファイル内の検索と置換を行うこともできます。

# delete all lines matching foobar 
ed -s test.txt <<< $'g/foobar/d\nw' 

詳細については、「スクリプトを使用してファイルを編集するed」を参照してください。

于 2009-06-14T16:37:52.863 に答える
4

bash スクリプト内でも python を使用できます。ここでの上位の回答のいくつかではあまり成功しませんでしたが、これはループを必要とせずに機能することがわかりました:

#!/bin/bash
python
filetosearch = '/home/ubuntu/ip_table.txt'
texttoreplace = 'tcp443'
texttoinsert = 'udp1194'

s = open(filetosearch).read()
s = s.replace(texttoreplace, texttoinsert)
f = open(filetosearch, 'w')
f.write(s)
f.close()
quit()
于 2016-05-03T18:44:19.903 に答える
1

rpl コマンドを使用できます。たとえば、php プロジェクト全体でドメイン名を変更したいとします。

rpl -ivRpd -x'.php' 'old.domain.name' 'new.domain.name' ./path_to_your_project_folder/  

これは明確な原因ではありませんが、非常に迅速で便利です。:)

于 2015-02-12T08:34:49.443 に答える