sedを使用して特殊文字を含む文字列を特殊文字を含む他の文字列に置き換える

sedを使用して特殊文字を含む文字列を特殊文字を含む他の文字列に置き換える

bashプロンプトを.bashrcの他のプロンプトに自動的に切り替えたいと思います。

元の文字列:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

置換文字列:

IPeth0=$(Adr=$(ifconfig eth0 |grep inet); echo $Adr | awk '{print $2}' | cut -c 6- )
PS1='\d \t \[\e[0;31m\]\u@$IPeth0\[\e[0;32m\]:\[\e[0;36m\]\w# \[\e[m\] '

このためにbashを書くための多くの誤った試みの1つは次のとおりです。

#!/bin/bash
original="PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '"
replacement="PS1='\d \t \[\e[0;31m\]\u@$IPeth0\[\e[0;32m\]:\[\e[0;36m\]\w# \[\e[m\] '" 
ipvar="IPeth0=$(Adr=$(ifconfig eth0 |grep inet); echo $Adr | awk '{print \$2}' | cut -c 6- )"

cp ~/.bashrc ~/.bashrc.bak
sed -e 's/$original/$replacement/g' ~/.bashrc

sedで '\'、 '/'、および '&'をエスケープする必要があることを知っているので、すべての文字を二重エスケープしてみました。私はこの問題を理解できないようです。

最初の回線を交換できなかったため、IP回線をすぐに接続しようとしました。

このタイプの自動化のためのより良い方法がある場合はお知らせください。

答え1

以下はいくつかの方法です(2.5)。

  • PS1共通のテンプレートに従うように設定を段階的に変更することに興味がある場合は、

    • その行のみを含むファイルを作成しますPS1=…
    • sedたとえば、セクションごとに編集するコマンドを作成します。
      • sed -e 's/${debian_chroot:+($debian_chroot)}/\\d \\t /'
      • sed -e 's/\\033/\\e/g'
      • など。
    • より小さくシンプルなコマンドをデバッグする方が簡単かもしれません。すべてのタスクが完了すると、すべてのタスクを1つにリンクするのが簡単になります。
    • あなた見ているの価値$original?たとえば、終わりましたか
              printf "%s\n" "$original"
      ?あなたが次のようなことを言うとき、これだけを覚えておいてください。

      "The quick brown fox 'jumps over' the lazy dog."
      

      完全な文字列は次の場所にあります。ダブル引用符。だからあなたが言うとき

      "Humpty '$var' Dumpty"
      

      $var二重引用符で囲まれているので拡張されます。

      それでは文字列を見てくださいoriginal

      original="PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:…"
      

      ${debian_chroot:+($debian_chroot)}そのように割り当てると、範囲が拡張されます。だからこれは問題です。

  • すでに存在する値に新しい値を変更するには、キツネ像を削り、犬の像を作成するPS1ために粘土を追加しないで、「sed」を使用して既存の割り当てを削除して置き換えます。秒change) コマンドは、1 つ以上のラインセットを 1 つ以上のラインセットに置き換えます。

    sed -e $'/^PS1=/c\
    IPeth0=$(Adr=$(ifconfig eth0 |grep inet); echo $Adr | awk \'{print $2}\' | cut -c 6- )\
    PS1=\'\d \t \[\e[0;31m\]\u@$IPeth0\[\e[0;32m\]:\[\e[0;36m\]\w# \[\e[m\] \''
    

    生の文字を文字列に入れることができるように、コマンド文字sed列全体をここに配置しました。必要に応じて検証済みの方法を使用できます。$'…'\''

    '$not_a_variable …'"… please don't try to expand those …"'… $not_a_variable'
    

    (代替参照)技術。

  • 上記の変形は

    sed -e $'/^PS1=/{s/^/# /; a\
    IPeth0=$(Adr=$(ifconfig eth0 |grep inet); echo $Adr | awk \'{print $2}\' | cut -c 6- )\
    PS1=\'\d \t \[\e[0;31m\]\u@$IPeth0\[\e[0;32m\]:\[\e[0;36m\]\w# \[\e[m\] \'
    }'
    

    既存の定義(s/^/# /)をコメントアウトする新しい行を追加するには、このコマンドを使用しますa

関連情報