引用符を使用してiniファイルのカテゴリ内で文字列をエコーする方法

引用符を使用してiniファイルのカテゴリ内で文字列をエコーする方法

次のiniファイルがあります。

[Admin Prefixes]
# Here you can add custom prefixes to specific players or flags that are shown when using $admin_prefix$.
# Syntax: "type" "info" "prefix" "[expiration date]"

#"name" "OciXCrom" "[Timed Prefix]" "31.12.2030"
#"name" "OciXCrom" "[Scripter]"
#"steam" "STEAM_0:0:50153248" "[CM Creator]"
#"ip" "127.0.0.1" "[BOT]"
#"flag" "l" "[Head Admin]"
#"flag" "d" "[Server Admin]"
#"flag" "e" "[Test Admin]"
#"flag" "mnp" "[Premium]"
#"flag" "b" "[VIP]"
"flag" "s" "&x06]~Moderator~["
"flag" "r" "&x07]~ADMIN~["
"flag" "d" "&x06]~ADMIN~["
"flag" "f" "&x04]~ADMIN~["



[Chat Colors]
# Here you can add different chat colors to specific players or flags that are shown when using $chat_color$.
# Syntax: "type" "info" "chat color" "[expiration date]"

"flag" "s" "&x07"
"flag" "r" "&x07"
"flag" "d" "&x06"
"flag" "f" "&x01"
"flag" "" "&x01"


[Name Customization]
# Here you can modify the name shown for certain players when using $custom_name$.
# Syntax: "type" "info" "custom name" "[expiration date]"

"name" "OciXCrom" "&x03Oci&x04XC&x03rom"

"steam" "STEAM_0:0:50153248" "[CM Creator]"たとえば、アイテムを挿入したいと思います。[管理者プレフィックス]部分

どうすればいいですか?このプロセスを自動化するためにbashスクリプトを作成したいからです。

私はLinuxを初めて使用します。誰でも私を助けることができますか? :)

答え1

Echoは最高のツールではないかもしれません。新しい行を挿入する場所を決定し、sedの追加オプションを使用します。たとえば、ファイルの末尾に追加します。

sed '$a "steam" "STEAM_0:0:50153248" "[CM Creator]"' your_ini_file

15行目の後に追加するには$を15に変更し、行の後ろに一意のパターンを追加するには$を/ PATTERN /に置き換えます。

答え2

awkを使用すると、ターゲットセクションの最後の空でない行の後に新しいテキストを追加できます。

$ cat tst.awk
/^\[/ { prt() }
{ rec[++numLines] = $0 }
NF { lastPopulated = numLines }
END { prt() }

function prt(   i) {
    for ( i=1; i<=lastPopulated; i++ ) {
        print rec[i]
    }
    if ( rec[1] == tgtSect ) {
        print newText
    }
    for ( ; i<=numLines; i++ ) {
        print rec[i]
    }
    numLines = 0
}

$ awk -v tgtSect='[Admin Prefixes]' -v newText='"steam" "STEAM_0:0:50153248" "[CM Creator]"' -f tst.awk file
[Admin Prefixes]
# Here you can add custom prefixes to specific players or flags that are shown when using $admin_prefix$.
# Syntax: "type" "info" "prefix" "[expiration date]"

#"name" "OciXCrom" "[Timed Prefix]" "31.12.2030"
#"name" "OciXCrom" "[Scripter]"
#"steam" "STEAM_0:0:50153248" "[CM Creator]"
#"ip" "127.0.0.1" "[BOT]"
#"flag" "l" "[Head Admin]"
#"flag" "d" "[Server Admin]"
#"flag" "e" "[Test Admin]"
#"flag" "mnp" "[Premium]"
#"flag" "b" "[VIP]"
"flag" "s" "&x06]~Moderator~["
"flag" "r" "&x07]~ADMIN~["
"flag" "d" "&x06]~ADMIN~["
"flag" "f" "&x04]~ADMIN~["
"steam" "STEAM_0:0:50153248" "[CM Creator]"



[Chat Colors]
# Here you can add different chat colors to specific players or flags that are shown when using $chat_color$.
# Syntax: "type" "info" "chat color" "[expiration date]"

"flag" "s" "&x07"
"flag" "r" "&x07"
"flag" "d" "&x06"
"flag" "f" "&x01"
"flag" "" "&x01"


[Name Customization]
# Here you can modify the name shown for certain players when using $custom_name$.
# Syntax: "type" "info" "custom name" "[expiration date]"

"name" "OciXCrom" "&x03Oci&x04XC&x03rom"

あるいは、あなたの場合のように、新しいテキストがすでに入力ファイルに存在し、コメントアウトされている場合はコメントアウトを削除できます(存在しない場合は追加されます)。

$ cat tst.awk
/^\[/ { prt() }
{ rec[++numLines] = $0 }
NF { lastPopulated = numLines }
END { prt() }

function prt(   i,text) {
    for ( i=1; i<=lastPopulated; i++ ) {
        if ( rec[1] == tgtSect )  {
            text = rec[i]
            sub(/^[[:space:]]*#[[:space:]]*/,"",text)
            if ( text == newText ) {
                rec[i] = newText
                tgtSect = ""
            }
        }
        print rec[i]
    }
    if ( rec[1] == tgtSect ) {
        print newText
    }
    for ( ; i<=numLines; i++ ) {
        print rec[i]
    }
    numLines = 0
}

$ awk -v tgtSect='[Admin Prefixes]' -v newText='"steam" "STEAM_0:0:50153248" "[CM Creator]"' -f tst.awk file
[Admin Prefixes]
# Here you can add custom prefixes to specific players or flags that are shown when using $admin_prefix$.
# Syntax: "type" "info" "prefix" "[expiration date]"

#"name" "OciXCrom" "[Timed Prefix]" "31.12.2030"
#"name" "OciXCrom" "[Scripter]"
"steam" "STEAM_0:0:50153248" "[CM Creator]"
#"ip" "127.0.0.1" "[BOT]"
#"flag" "l" "[Head Admin]"
#"flag" "d" "[Server Admin]"
#"flag" "e" "[Test Admin]"
#"flag" "mnp" "[Premium]"
#"flag" "b" "[VIP]"
"flag" "s" "&x06]~Moderator~["
"flag" "r" "&x07]~ADMIN~["
"flag" "d" "&x06]~ADMIN~["
"flag" "f" "&x04]~ADMIN~["



[Chat Colors]
# Here you can add different chat colors to specific players or flags that are shown when using $chat_color$.
# Syntax: "type" "info" "chat color" "[expiration date]"

"flag" "s" "&x07"
"flag" "r" "&x07"
"flag" "d" "&x06"
"flag" "f" "&x01"
"flag" "" "&x01"


[Name Customization]
# Here you can modify the name shown for certain players when using $custom_name$.
# Syntax: "type" "info" "custom name" "[expiration date]"

"name" "OciXCrom" "&x03Oci&x04XC&x03rom"

"steam"...これで、ブロックの末尾に追加の行が追加されるのではなく、ターゲットブロックの前半にある既存の行のコメントが解除されます。

2番目のスクリプトは、新しいテキストが入力ファイルにすでに存在し、コメントが解除されている場合(たとえば、以前にこのスクリプトを実行した場合)、新しいテキストが再追加されないことを意味します。

2番目のスクリプトは、POSIX文字クラスをサポートするawkに依存しています。そうでない場合は、各スクリプト[[:space:]][ \t]

関連情報