86

我正在尝试通过删除不必要的空格、空行以及括号与它们之间的空格来平衡我的代码,所以:

    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

另外,有没有办法让这个脚本更简洁,例如删除或减少命令的数量?

4

6 回答 6

95

如果您使用的是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).
于 2012-08-23T23:44:07.660 回答
20

您必须在前面+加上\,否则会sed尝试匹配字符+本身。

为了使脚本“更智能”,您可以将所有表达式累积在一个 sed 中:

sed -e 's/((/( (/g' -e 's/))/) )/g' -e 's/ \+/ /g' -e '/^$/d' $filename > new.txt

一些实现sed甚至支持启用就地-i更改文件的选项。

于 2012-08-23T23:41:11.387 回答
12

有时,-r 和 -e 不起作用。我正在使用 sed 4.2.1 版,它们根本不适合我。

一个快速的技巧是改用 * 运算符。所以假设我们想用一个空格替换所有多余的空格字符: 我们想做:

sed 's/ +/ /'

但是我们可以使用它来代替:

sed 's/  */ /'

(注意双空格)

于 2013-03-14T02:55:06.600 回答
4

可能不是最干净的解决方案。但是如果你想避免-E-r保持与两个版本的 sed 兼容,你可以做一个重复字符cc*- 那是 1c然后 0 或多个c1==或多个c

或者只是使用@cdarke建议的 BRE 语法来匹配特定的数字或模式c\{1,\}。逗号后的第二个数字被排除在外以表示 1 或更多。

于 2018-02-28T10:25:47.517 回答
1

这可能对您有用:

sed -e '/^$/d' -e ':a' -e 's/\([()]\)\1/\1 \1/g' -e 'ta' -e 's/  */ /g' $filename >new.txt
于 2012-08-24T05:55:50.360 回答
0

在 bash 前面;

首先我做了一个脚本 test.sh

猫测试.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
于 2016-01-15T16:31:29.197 回答