私は現在Ubuntuに慣れています。複数のbashファイルを扱うプライベートプロジェクトがあります。
config.txt
次の文字列を含むファイルがあります。
hostip="192.168.1.2"
pname="My Office"
pid="01-001"
hostip
私の質問は、fileの変数が必要なbashファイルがある場合は文字列をどのようにconfig.txt
抽出しますか192.168.1.2
(二重引用符は出力から削除する必要があります)です。
答え1
awk
これを達成するためにこれを使用できます。たとえば、次のようになります。
$ awk -F'"' '/hostip/ {print $2}' host.txt
192.168.1.2
- この
-F
オプションはフィールド区切り文字を決定します。 /hostip/
検索文字列の決定{print $2}
印刷するフィールドを決定します。
これにより、ファイルから文字列を取得し、bashスクリプト内の変数に入れることができます。たとえば、次のようになります。
hostip=$(awk -F'"' '/hostip/ {print $2}' host.txt)
答え2
使用sed
sed -n "s/hostip=\([^ ]*.*\)/\1/p" config.txt
ただし、config.txt宣言にスペースが含まれている場合(例:)hostip = 192.168.1.2
:
sed -n "s/hostip *= *\([^ ]*.*\)/\1/p" config.txt
最後に、人生をより簡単にするために関数やラッパースクリプトを作成します。
get_value() {
sed -n "s/$1 *= *\([^ ]*.*\)/\1/p" $2
}
get_value hostip config.txt
# prints 192.168.1.2
get_value pname config.txt
# prints My Office
hostip=$(get_value hostip config.txt)
答え3
Raku(旧Perl6)を使う
~$ raku -ne 'put $/ if m/ <?after hostip\= > \" <([\d**1..3 \.]**3 \d**1..3)> \" /;' config1.txt
192.168.1.2
コマンド-ne
ラインフラグはRakuに入力を1行ずつ確認するように指示します。上記のコードは、次のように書かれた正のゼロ幅LookBehindアサーションを使用します<?after … >
。正規表現は、ピリオドで区切られた1〜3桁の数字グループの4つの数字グループに一致する項目を探します。この<( … )>
イディオムはRakuに各外部一致を削除し、内部一致を返され$/
た一致変数にロードするように指示します。
HTH。