对于文件列表,我想匹配那些不以.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,因为我没有足够的声誉点来创建它。遗憾!
答案 0 :(得分:3)
答案 1 :(得分:3)
您可以使用Negative Lookahead来实现此目的。
^(?!.*\.txt).+$
您可以使用选项-P
:
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)
这实际上取决于您使用的正则表达式工具。许多工具提供了一种颠倒正则表达式的方法。例如:
# 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$ ]]
# succeeds if filename ends with .txt
egrep -q "\.txt$" <<<"$filename"
# succeeds if filename does not end with .txt
egrep -qv "\.txt$" <<<"$filename"
/\.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" }
/[^t]$|[^x]t$|[^t]xt$|[^.]txt$/