我知道这是一个丑陋的剧本,但它完成了这项工作。 我现在面临的是增加一些扩展,这将更加混乱。 如何使其更加模块化? 具体来说,如何在多行上编写这个长正则表达式(源文件扩展名)?说每行一个扩展名。我想我在使用字符串连接时遇到了问题,但不确定究竟是什么。 这是原始文件:
#!/bin/bash
COMMAND='svn status'
XARGS='xargs'
SVN='svn add'
$COMMAND | grep -E '(\.m|\.mat|\.java|\.js|\.php|\.cpp|\.h|\.c|\.py|\.hs|\.pl|\.xml|\.html|\.sh|.\asm|\.s|\.tex|\.bib|.\Makefile|.\jpg|.\gif|.\png|.\css)'$ | awk ' { print$2 } ' | $XARGS $SVN
这里大致是我的目标
...code code
'(.\m|
\.mat|
\.js|
.
.
.
.\css)'
..more code here
任何人
答案 0 :(得分:1)
#!/bin/bash
COMMAND='svn status'
XARGS='xargs'
SVNADD='svn add'
pats=
pats+=' \.m'
pats+=' \.mat'
pats+=' \.java'
pats+=' \.js'
# add your 'or-able' sub patterns here
# build the full pattern
pattern='(';for pat in $pats;do pattern+="$pat|";done;pattern=${pattern%\|}')$'
# run grep with the generated pattern
files=$($COMMAND | grep -E ${pattern} | awk ' { print $NF } ')
if [ " $files" != " " ]
then
$COMMAND | grep -E ${pattern} | awk ' { print $NF } ' | $XARGS $SVNADD
fi
答案 1 :(得分:1)
这个怎么样:
PATTERNS="
\.foo
\.bar
\.baz"
# Put them into one list separated by or ("|").
PATTERNS=`echo $PATTERNS |sed 's/\s\+/|/g'`
$COMMAND | grep -E "($PATTERNS)"
(请注意,如果在调用echo中调用$ PATTERNS周围的引号,这将不起作用 - echo正在处理剥离空格并将换行转换为空格。)
答案 2 :(得分:1)
我知道这并没有直接回答这个问题,但从可读性的角度来看,我认为大多数开发人员会同意单行正则表达式是最常用的做事方式,因此是最易维护的方法。此外,我不确定您为什么要在每个扩展中包含一段时间,这应该只需要使用一次。
我写了这个小脚本来自动将所有图像添加到svn。您应该能够在正则表达式中的管道之间添加扩展,以添加或删除不同的文件类型。请注意,它确保仅通过确保每行以“?”开头来添加无法识别的文件。 (^ \?)并以句点结尾(\。(extensions)$)。希望它有用!
#!/bin/bash
svn st | grep -E "^\?.*\.(png|jpg|jpeg|tiff|bmp|gif)$" > /tmp/svn-auto-add-img
while read output; do
FILE=$(echo $output | awk '{ print $2 }')
svn add $FILE
done < /tmp/svn-auto-add-img
exit 0