'+'(一次或多次出现)不使用'sed'命令

时间:2012-08-23 23:40:06

标签: macos bash sed

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

    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

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

6 个答案:

答案 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)

在bash前面

;

首先我制作了一个脚本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