以下の内容を持ったテキストファイル「test.txt」があるとします。
Xfoo11111barXXXXXXXXXXX
XXXfoo22222barXXXXXXXXX
XXXXXXfoo33333barXXXXXX
各行から “foo” と “bar” に囲まれた部分を抽出する方法を紹介します。
つまり、以下の出力が得られれば成功です。
11111
22222
33333
awk コマンドを使って実現するには、以下のコマンドを実行します。
awk '{print substr($0, index($0, "foo") + length("foo"), index($0, "bar") - index($0, "foo") - length("bar"))}' test.txt
- awk の組み込み関数
index()
,length()
,substr()
を使っています。 index(文字列A, 文字列B)
と記述すると、文字列Aの中における文字列Bの先頭位置を返してくれます。substr(対象文字列, 開始文字位置, 抽出する文字列の長さ)
と記述すると、対象文字列の中の「開始文字位置」から、「抽出する文字列の長さ」の分の文字列を返してくれます。length(文字列)
と記述すると、その文字列の長さが返されます。- 「
$0
」は元のファイルの各行の文字列を指しています。 - 簡単に言ってしまうと、
substr()
関数を使って、指定された文字列の間の文字列を抽出しているだけです。抽出する文字列の開始位置と長さを、不格好ながらなんとかして指定しています。
同じことを sed コマンドで実現する場合は、以下のように実行します。
sed 's|^.*\?foo\(.*\)bar.*\?$|\1|' test.txt
参考