使用fswatch进行正则表达式 - 排除不以“.txt”结尾的文件

时间:2014-10-28 19:32:09

标签: regex bash fswatch

对于文件列表,我想匹配那些不以.txt结尾的文件。我目前正在使用这个表达式:

.*(txt$)|(html\.txt$)

This expression will match everything ending in .txt, but I'd like it to do the opposite.


应匹配:

happiness.html
joy.png
fear.src

应该 匹配

madness.html.txt
excitement.txt

我想得到这个,所以我可以与fswatch配对使用它:

fswatch -0 -e 'regex here' . | xargs -0 -n 1 -I {} echo "{} has been changed"

问题是它似乎不起作用。

PS:我使用标签bash而不是fswatch,因为我没有足够的声誉点来创建它。遗憾!

4 个答案:

答案 0 :(得分:3)

尝试使用lookbehind,如下所示:

.*$(?<!\.txt)

Demonstration

基本上,只要最后4个字符不是".txt",这就匹配任何文本行。

答案 1 :(得分:3)

您可以使用Negative Lookahead来实现此目的。

^(?!.*\.txt).+$

Live Demo

您可以使用选项-P

将此表达式与grep一起使用
grep -Po '^(?!.*\.txt).+$' file

答案 2 :(得分:1)

由于问题已被标记为bash,因此可能不支持前瞻(grep -P除外),这里有一个grep解决方案,不需要前瞻:

grep -v '\.txt$' file
happiness.html
joy.png
fear.src

编辑:您可以使用此xargs命令来避免匹配*.txt个文件:

xargs -0 -n 1 -I {} bash -c '[[ "{}" == *".txt" ]] && echo "{} has been changed"'

答案 3 :(得分:0)

这实际上取决于您使用的正则表达式工具。许多工具提供了一种颠倒正则表达式的方法。例如:

的bash

# succeeds if filename ends with .txt
[[ $filename =~ "."txt$ ]]
# succeeds if filename does not end with .txt
! [[ $filename =~ "."txt$ ]]
# another way of writing the negative
[[ ! $filename =~ "."txt$ ]]

的grep

# succeeds if filename ends with .txt
egrep -q "\.txt$" <<<"$filename"
# succeeds if filename does not end with .txt
egrep -qv "\.txt$" <<<"$filename"

AWK

/\.txt$/ { print "line ends with .txt" }
! /\.txt$/ { print "line doesn't end with .txt" }
$1 ~ /\.txt$/ { print "first field ends with .txt" }
$1 !~ /\.txt$/ { print "first field doesn't end with .txt" }

对于喜欢冒险的人,可以在任何posix兼容的正则表达式引擎中使用posix ERE

/[^t]$|[^x]t$|[^t]xt$|[^.]txt$/