sedなどで、特定の文字列の後の文字列を抽出したい

シェルスクリプト内で、sedなどを使って特定の文字列の後の文字列を抽出したいのですが、どうすればいいでしょうか?

たとえば、abcXYZ123defghiのなかから、XYZの後の「123」を抜き出したいです。

echo abcXYZ123defghi | sed ...

のようにして実行させたいです。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

日本語対応sedだと日本語数字混じりでもできますね。



echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/' -e 'y/0123456789/0123456789/'
12357

※ 使っている日本語コードの指定は必要かも(例えば、 --ctype=EUC)

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/'
12357

※ 入力フォームに書いている時はASCIIと日本語の判別がし易いけど回答見るとわかり難いですね。後ろの例での結果57とy/0123456789/の数字部分が日本語です。
    • good
    • 2

「XYZの後の文字列」だと123defghiですが、123を抜き出したいということは、「XYZの後の数字」を抜き出したいと言うことですか?



sed 's/.*XYZ\([0-9]*\).*/\1/'
    • good
    • 3
この回答へのお礼

ありがとうございます。
言葉足らずでしたが、今回は数字を取り出したかったです。
ただ、特定の文字数の場合や、アルファベットのときもあるので、
教えていただいた方法を応用したいと思います。
アルファベットなら、[0-9]のかわりに[a-z]にすればいいのですよね?

お礼日時:2010/11/04 15:37

echo abcXYZ123defghi | sed -e 's/^.*XYZ\(...\).*$/\1/'

    • good
    • 1
この回答へのお礼

ありがとうございます。
こちらは、XYZの3文字を取るということでしょうか??

ちなみに、「^」はどういう意味でしょうか?

お礼日時:2010/11/04 15:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Qawkやsed等で特定の文字間を抜き出す

cat text
aaaa
bbbb
<AAA>
ccc
ddd
<BBB>
eee
とあるときに
<AAA>
ccc
ddd
<BBB>
だけ抜き出したいです。
どのようにすればよいでしょうか?

Aベストアンサー

sed なら
sed -ne '/<AAA>/,/<BBB>/p'
awk なら
awk '/<AAA>/,/<BBB>/{print}'
ついでに perl なら
perl -ne 'print if /<AAA>/ .. /<BBB>/'

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'

Qawkを用いて、特定の文字を含む以下の行を抜き出す

件名にあるように
awkを用いて、特定の文字を含む以下の行を抜き出したいのですが
どのようにしたらよいでしょうか?

具体的には
#cat text
aaaa
bbb ccc
<exe> aa
xxxxx vvvv
・・・

というようなファイルtextがあるとき
<exe> 以下の行すべてを抜き出したいです。
ご教授お願いします。

Aベストアンサー

awk '/<exe>/,0' text

でいけるかと。
<exe> が第一フィールドにあるときだけとかいう
条件があるなら

awk '$1~/<exe>/,0' text

Qテキストファイルのn行目以下を出力する方法

catコマンドか他のコマンドを使って、テキストファイルのn行目以下を出力する方法はありますか?

Aベストアンサー

蛇足っぽいですが、sedによる別解です。
(3行目以降の場合)

>sed -ne '3,$p' input.txt

Q特定文字列間の文字列の抽出の際についての質問なのですが、

特定文字列間の文字列の抽出の際についての質問なのですが、

xxxxxaiueoyyyyyaiueoyyyyy
となっている場合aiueoだけを抽出したいのですが、

sed -n 's/.*xxxxx\(.*\)yyyyy.*/\1/p'
とすると
aiueoyyyyyaiueo
が出力されてしまいます。

エンド文字が複数あった場合最初にマッチしたものまでの抽出は
どのようにしたら宜しいのでしょうか?

Aベストアンサー

「最短一致」があれば
s/.*xxxxx\(.*?\)yyyyy.*/\1/
なんだろうけど, GNU sed にはそんな便利なものはないので... ん~, この場合だと
s/.*xxxxx\(\(y\{0,4\}[^y]\)*\)yyyyy.*/\1/p
でいいのかなぁ? もちろんもっと一般的な場合にはより面倒.

Q~以外を削除する場合(rmコマンド)

linuxのコマンドで
~以外のファイル、ディレクトリを全て削除したい時は
どのような記述をすれば良いのでしょうか?
シェルスクリプトではなくrmコマンド1つで削除したのいですが…

例: tar以外のファイル・ディレクトリを
   すべて削除したい場合など

どなたかご存知の方がいらっしゃったら
教えてください。よろしくお願い致します。

Aベストアンサー

rm コマンドのみという訳にはいきませんが基本的なコマンドを組み合わせると実現可能と思います。

「名前が tar で終わるもの以外のファイル・ディレクトリを削除する」場合だと

ls | grep -v -E 'tar$' | xargs rm -r

となります。

ファイルの一覧を取得し ( ls )
'tar'で終わるもの以外を抽出し ( grep )
その結果を rm -r の引数に指定して実行 ( xargs )

という流れです。

ファイルを削除するような操作については失敗するとダメージが大きいので、事前にテストして動作を確認すると良いとおもいます。また rm -r -i としてそれぞれのファイルについて、削除の問い合わせをするのも有効です。

Qgrep 検索 検索対象の行と、そのn段下(もしくは上)までの行を合わせて出力したい

ファイル ./test の内容は以下のとおりです。

test1
30
50
12
test2
60
12
01
test3
***
20
***

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(1)例えば "test2"という文字列を含む行と、合わせて下3行を拾って表示させたい時は、どのようにコマンドを打てばよいのですか?

test2
60
12
01
のように表示させたい。

(2)あらかじめ、とりだしたい情報がn行目にあるとわかっている時に、
取り出したい行を複数指定して表示させるにはどのようにコマンドを打てばよいですか?

Aベストアンサー

(1)
$ grep -A 3 test2 ./test
-Aオプションで、マッチしたところから指定した行数分後ろの行まで表示します。(A=Afterの意)
(同様に、-B オプションで、マッチしたところより前の行を表示することもできます。(B=Beforeの意))

(2)
抽出する行が1つだけなら、
tail コマンドとheadコマンドの組み合わせでできます。
$ tail +5 ./test | head -1
で、ファイル「test」の5行目1行だけを抽出できます。

開始行を指定して複数行抽出したい場合なら、
$ tail +5 ./test | head -3
で、ファイル「test」の5行目からの3行分を抽出できます。

(tail コマンドの「+数字」で、指定した行数以降を抽出し、それをパイプでつないで、head コマンドの 「-数字」 先頭から指定行数取り出し)

複数の開始行を指定して、それぞれから1行ずつ抽出したい場合、
bash などの bource shell 系なら、for コマンドを使って、
$ for n in 1 5 9; do tail +$n ./test | head -1; done
で、1行目、5行目、9行目を抽出できます。

(1)
$ grep -A 3 test2 ./test
-Aオプションで、マッチしたところから指定した行数分後ろの行まで表示します。(A=Afterの意)
(同様に、-B オプションで、マッチしたところより前の行を表示することもできます。(B=Beforeの意))

(2)
抽出する行が1つだけなら、
tail コマンドとheadコマンドの組み合わせでできます。
$ tail +5 ./test | head -1
で、ファイル「test」の5行目1行だけを抽出できます。

開始行を指定して複数行抽出したい場合なら、
$ tail +5 ./test | head -3
で、ファイル「test」...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング