出産前後の痔にはご注意!

正規表現で指定した文字列を"含まない"行を指定する方法はありますでしょうか。
例えば、

ABDDDDG
ABEEEEG
ABFFFFG
ABXXXXG
ABHHHHG

とある場合、「XXXX」を含まない行、という指定をして他の4行を指定したいのです。

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

A 回答 (4件)

ANo1さんも仰られているとおり、御自身で開発されるのであればプログラム言語側の判別で振り分けたほうが良いと思います。


ただ其れとは別に特定ツールの機能内で何とかしたい等、「どうしても正規表現で」ということであればで一例を記載しますが・・・おすすめはしません。

# 基本形
# 空行(というか、改行のみ)だろうとマッチ
# 否定先読みによって、「弾きたい文字列の表われない行の行頭」にマッチさせています。
/^(?!.*XXXX)/
http://ideone.com/TFsXh

# 応用例
# 空行(というか、改行のみ)はマッチ除外
/^.(?!.*XXXX)/
http://ideone.com/XvywR

<おまけ>
否定戻り読みはPCRE系でも利用できない物が多く感じる為省きました。
最後に再掲しますが、この手法をお勧めはしません。
    • good
    • 0
この回答へのお礼

頂いた正規表現を秀丸で試したところ、
^.(?!.*XXXX).*$
という形で行指定が出来ました!

正直頂いた形を完全に理解出来ていないのですが、一つずつ確認したいと思います。
ご回答ありがとうございました。

お礼日時:2011/06/09 21:32

他の方の回答を見ていると、


プログラムとしてつくるのが案外大変なのがわかります。

参考までに、awkですと、こんな感じでしょうか。

データが test.txt に入っているとして、
gawk "!/XXXX/" test.txt
    • good
    • 0
この回答へのお礼

awkというのは知らなかったのですがかなりシンプルに出来そうですね。ちょっと調べてみたいと
思います。
ご回答ありがとうございました。

お礼日時:2011/06/09 21:25

直接「XXXXを含まない」を表現してみたけど、


これが実用的につかえることってほぼないよね。
https://ideone.com/OYh6a

var arr = [
  "ABDDDDG"
 ,"ABEEEEG"
 ,"ABFFFFG"
 ,"ABXXXXG"
 ,"ABHHHHG"
];
var reg = /^(?:[^X]|X[^X]|XX[^X]|XXX[^X])*$/
print(
  arr.filter(function (s) {
    return reg.test(s);
  }).join('\n')
);
    • good
    • 0
この回答へのお礼

やはりプログラム込みでないと厳しいのですね。
ご回答ありがとうございました。

お礼日時:2011/06/09 21:23

プログラムとかでやるなら「XXXXを含む行 ではない」というやりかたが簡単なのですが。



grepコマンドの例:
grep -v XXXX
# -v は「マッチしない行を出力する」オプション

sedコマンドの例:
sed '/XXXX/d'
# XXXXにマッチした行を削除する

Perlでの例:
if ( !/XXXX/ ) {
# XXXX を含まない行の処理
}
    • good
    • 0
この回答へのお礼

秀丸でサッとやりたい、という想定でしたので正規表現のみでやれるのがベストなのですが
それはムリなのですね。
教えていただいた方法を使いたいと思います。
ありがとうございました!

お礼日時:2011/06/09 21:22

この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ベストアンサー

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

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

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

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

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

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

Aベストアンサー

awk '/<exe>/,0' text

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

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

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

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

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

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

echo abcXYZ123defghi | sed ...

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

Aベストアンサー

日本語対応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/の数字部分が日本語です。

Qsedで正規表現の後方参照を使いたい。

後方参照の練習をしようとしています。
1111:2222:3333:4444
5555:6666:7777:8888

というファイルを:でフィールドを区切って1列目と2列目を
sedをつかってひっくり返そうとしました。

sed 's/^(\d{4}):(\d{4})/^$2:$1/' test.file
などいろいろやってみたのですがうまくいきません。
良ければ教えてください。

Aベストアンサー

伝統的には、grep コマンドでつかうのが「正規表現」、egrep コマンドで使うのが「拡張正規表現」で、Perl等のは拡張正規表現のさらに拡張になってます。
すでに出ているように、( | ) { } 等が文字そのままの意味なのか正規表現の特殊文字なのかの切り替えに \ をつけるかつけないかなどが違います。

ここにまとめられています。
http://www.kt.rim.or.jp/~kbk/regex/regex.html

Q正規表現の否定先読みで、複数の否定文字列を指定する方法はありませんか?

正規表現の否定先読みで、複数の否定文字列を指定する方法はありませんか?

例えば、
/(a)(?!bbb)/
は、後ろにbbbが続かないaを意味すると思いますが、
後ろにbbb、ccc、dddのいずれもが続かないaを表現する方法を探しています。

Aベストアンサー

単純に
/a(?!bbb|ccc|ddd)/
じゃダメなんだっけ?

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...続きを読む

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

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

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

のようなセットを行い、

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

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

Aベストアンサー

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

aaa='bbb
ccc'

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

Q文字列の一部を取り除きたい(awk?)

こんにちわ。

下記の文字列操作を行いたいのですが上手くいきません。
どなたか教えて下さい。
環境OSはsolarisです。
awkにはこだわりません。

・最初の2文字を取り除く
・最後の文字が"2"の場合取り除く


yoroshikune → roshikune
onegai2 → egai

Aベストアンサー

どうせなら、両方ともsedで、

sed -e 's/^..//' -e 's/2$//'

awkだと、
awk '{X=substr($0,3);sub(/2$/,"",X);print X}'

Q特定の文字列を含む行だけ削除する方法?

いつもお世話になっています。

Unixであるテキストファイルから、
特定の文字列を含む行(レコード)だけを
削除する方法を教えてください。

現在、grepを使って、いろいろ試しているのですが、
正規表現で、
”***”を含まない行(レコード)だけを
切り出すとう正規表現の説明が見あたりません。

"^**"は、**以外の文字を検索できるようですが、
文字列に対しては、使えません。

grep以外の方法でも良いのですが、
なるべくシンプルにできる方法がありましたら
教えてください。

宜敷お願いします。

Aベストアンサー

この場合、単純に

> grep -v 特定の文字列

とされるといいのでは?

-v オプションはずばり、「その文字列を含まない行を出力する」オプションです。


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

人気Q&Aランキング