我正在尝试通过去除不必要的空格,空行以及括号与它们之间的空格平衡来优化我的代码,所以:
int a = 4;
if ((a==4) || (b==5))
a++ ;
应改为:
int a = 4;
if ( (a==4) || (b==5) )
a++ ;
它适用于括号和空行。但是,它会忘记将多个空格减少到一个空格:
int a = 4;
if ( (a==4) || (b==5) )
a++ ;
这是我的剧本:
#!/bin/bash
# Script to refine code
#
filename=read.txt
sed 's/((/( (/g' $filename > new.txt
mv new.txt $filename
sed 's/))/) )/g' $filename > new.txt
mv new.txt $filename
sed 's/ +/ /g' $filename > new.txt
mv new.txt $filename
sed '/^$/d' $filename > new.txt
mv new.txt $filename
另外,有没有办法让这个脚本更简洁,例如删除或减少命令数量?
答案 0 :(得分:61)
如果您使用 GNU sed ,则需要使用sed -r
强制sed
使用扩展正则表达式,包括+
的通缉行为。见man sed
:
-r, --regexp-extended
use extended regular expressions in the script.
如果您使用 OS X sed ,情况也是如此,但您需要使用sed -E
:
-E Interpret regular expressions as extended (modern) regular expressions
rather than basic regular regular expressions (BRE's).
答案 1 :(得分:13)
您必须在+
之前加\
,否则sed
会尝试匹配字符+
本身。
要使脚本“更智能”,您可以在一个sed:
中累积所有表达式sed -e 's/((/( (/g' -e 's/))/) )/g' -e 's/ \+/ /g' -e '/^$/d' $filename > new.txt
sed
的某些实现甚至支持-i
选项,该选项可以在适当的位置更改文件。
答案 2 :(得分:9)
有时候,-r和-e不会起作用。 我使用的是sed版本4.2.1,它们根本不适合我。
快速破解就是使用*运算符。 因此,我们想要用一个空格替换所有冗余空格字符: 我们想做:
sed 's/ +/ /'
但我们可以改用:
sed 's/ */ /'
(注意双空格)
答案 3 :(得分:3)
可能不是最干净的解决方案。但是,如果您想避免SUB
和-E
保持与两个版本的sed兼容,您可以执行重复字符-r
- 那是1 cc*
然后0个或更多c
' s c
1个或更多==
' s。
或者仅使用@cdarke建议的BRE语法来匹配特定数量的模式c
。逗号后的第二个数字被排除在1或更多之后。
答案 4 :(得分:1)
这可能对您有用:
sed -e '/^$/d' -e ':a' -e 's/\([()]\)\1/\1 \1/g' -e 'ta' -e 's/ */ /g' $filename >new.txt
答案 5 :(得分:1)
;
首先我制作了一个脚本test.sh
cat test.sh
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
SRC=`echo $line | awk '{print $1}'`
DEST=`echo $line | awk '{print $2}'`
echo "moving $SRC to $DEST"
mv $SRC $DEST || echo "move $SRC to $DEST failed" && exit 1
done < "$1"
然后我们制作一个数据文件和一个测试文件aaa.txt
cat aaa.txt
<tag1>19</tag1>
<tag2>2</tag2>
<tag3>-12</tag3>
<tag4>37</tag4>
<tag5>-41</tag5>
然后测试并显示结果。
bash test.sh list.txt
Text read from file: aaa.txt bbb.txt
moving aaa.txt to bbb.txt