1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

bashで否定先読みを使いたいときの回避策

Last updated at Posted at 2019-10-31

やりたいこと

bashのif文で、文字列の最初にドットが含まれない正規表現を条件式として使いたかった。
ファイルのリストから隠しファイル (ドットファイル) を除外したかったからである。

カレントディレクトリの状況↓

ls

.DS_Store
myfile.txt

ハマったところ

bashでは前方一致はできるが、否定先読み (前方一致の否定) は使えない1

前方一致:

file_name=$(ls)
if [[ $file_name =~ ^(\.).*$ ]];then echo $file_name; fi;

.DS_Store

否定先読み:

if [[ $file_name =~ ^(?!(/.)).*$ ]];then echo $file_name; fi;

bash: !: event not found

解決案

elseを使う方法もあるが、if内で処理を行わないので冗長になってしまう。
そこで、まずif文の条件式を前方一致にしておき、その条件式全体を!で否定することで、擬似的に否定先読みを行った。

否定先読みの回避策:

if [[ ! $file_name =~ ^\..*$ ]];then echo $file_name; fi;

myfile.txt

  1. Bashで正規表現をやろうとしたら 否定先読み(Negative Lookahead) が出来なくてハマった話 | Developers.IO

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?