複数行のテキストを含むテキスト ファイルがあります。正確に 1 行のテキストには、次のシーケンスがあります。
XMLcpLINK: ########
# のシーケンスは、任意の文字または記号にすることができます。
XMLcpLINK:
私がしなければならないことは、その後のシーケンスを見つけて変数に保存するまで、各行を読むことです。これを行うのに十分な UNIX リファレンスを教えてくれる人はいますか?
何かのようなもの
my_var=$(sed -n 's/XMLcpLINK: //p' file.txt)
するべきです。
ここにまともなsed
参照があります。
またはあなたが持っている場合GNU grep
:
my_var=$(grep -oP '(?<=XMLcpLINK: ).*' file.txt)
追加-m 1
することはajozwikgrep
が持っている良いアイデアです。少しスピードアップするはずです。
外部コマンドやサブシェルはありません
while IFS=': ' read name value; do
case "$name" in
XMLcpLINK) result="$value"
esac
done < input_file
echo "$result"
すでにいくつかの良い回答を得ていますが、改善の余地があります。
次のすべての値をXMLcpLINK
出力してから終了します。
とawk
:
$ awk '/^XMLcpLINK: /{print $2;exit}' file
########
とgrep
:
$ grep -Pom1 '(?<=^XMLcpLINK: ).*' file
########
とsed
:
$ sed -n '/^XMLcpLINK: /{s/XMLcpLINK: //p;q}' file
########
お気に入りを選択し、コマンド置換を使用して結果を変数に格納します。
$ var=$(awk '/^XMLcpLINK: /{print $2;exit}' file)
$ echo $var
########
grep -m 1 'XMLcpLINK' file.txt | awk '{ print $2}'
- 最初の出現のみ
grep 'XMLcpLINK' file.txt | awk '{ print $2}'
- すべて一致
#!/bin/bash
VAR=$(grep "XMLcpLINK: " test.txt | awk '{ print $2 }')
echo $VAR
test.txt は分析するファイルです。
これを実現するには、次の 2 つの方法があります。
bash とダッシュを使用すると、「myfile.txt」という名前のテストファイルを使用して、次のように動作するはずです。
while read i; do if [ "$i" != "${i#XMLcpLink: }" ]; then variable="${i#XMLcpLink: }"; break; fi; done <myfile.txt ; echo variable == "${variable}"
「${var#something}」の説明については、bash man ページの「パラメーター拡張」セクションを参照してください。
または、少し短く、おそらく高速です (一致した後にファイルに一致しない行が多数ある場合を除きます)。変数の前にスペースを付けても問題ない場合は、外部の grep および cut ユーティリティを使用します。
variable="`grep -e '^XMLcpLink: ' myfile|cut -d':' -f2-`" ; echo variable == "${variable}"
おそらくもっと多くの方法があり、おそらくそれを行うためのより良い方法があります。