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

Sid*_*tha 60 macos bash sed

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

    int a = 4;
    if ((a==4) ||   (b==5))

    a++   ;
Run Code Online (Sandbox Code Playgroud)

应改为:

    int a = 4;
    if ( (a==4) || (b==5) )
    a++ ;
Run Code Online (Sandbox Code Playgroud)

它适用于括号和空行.但是,它会忘记将多个空格减少到一个空格:

    int a = 4;
    if ( (a==4) ||   (b==5) )
    a++    ;
Run Code Online (Sandbox Code Playgroud)

这是我的脚本:

    #!/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
Run Code Online (Sandbox Code Playgroud)

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

Sic*_*cco 71

如果你正在使用GNU sed,那么你需要使用sed -r哪些力sed来使用扩展的正则表达式,包括想要的行为+.见man sed:

-r, --regexp-extended

       use extended regular expressions in the script.
Run Code Online (Sandbox Code Playgroud)

如果您使用的是OS X sed,则同样适用,但您需要使用sed -E:

-E      Interpret regular expressions as extended (modern) regular expressions
        rather than basic regular regular expressions (BRE's).
Run Code Online (Sandbox Code Playgroud)

  • 我是否正确使用OS X?`-r`适用于`GNU sed`,但`OS X sed`确实需要`-E`来使用扩展(现代)正则表达式.两者都区分_basic_和_modern_正则表达式,而`+`被解释为`sed`的_basic_函数中的普通字符.请参阅[此参考](https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man7/re_format.7.html#//apple_ref/doc/man/7/re_format): _Obsolete(''basic'')正则表达式在几个方面(...)'+'和'?'有所不同 是普通人物(...)_. (9认同)
  • -r似乎是一个非法选项,但我做了一个男人sed使用扩展正则表达式,它出现'-E'.试过它和宾果!有效!谢谢!但我现在感到困惑,'*'的使用有效但是为了使用'+'我必须使用-E标志? (3认同)

cho*_*oba 13

你必须先+用a \,否则sed尝试匹配角色+本身.

要使脚本"更智能",您可以在一个sed中累积所有表达式:

sed -e 's/((/( (/g' -e 's/))/) )/g' -e 's/ \+/ /g' -e '/^$/d' $filename > new.txt
Run Code Online (Sandbox Code Playgroud)

sed甚至一些实现支持-i可以在适当位置更改文件的选项.

  • 我不认为MacOS`sed`支持多个`-e`选项.在各个脚本命令之间使用分号或换行符,并将它们全部放在一个带引号的字符串中.同样在MacOS上,`-i`选项需要一个参数; 如果您不想备份,可以将空字符串传递给它.所以'sed -i''-E's ///; s ///; ...'"$ filename"` (2认同)

sta*_*ike 9

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

快速破解就是使用*运算符.所以假设我们想用一个空格替换所有冗余空格字符:我们想做:

sed 's/ +/ /'
Run Code Online (Sandbox Code Playgroud)

但我们可以用它代替:

sed 's/  */ /'
Run Code Online (Sandbox Code Playgroud)

(注意双倍空间)

  • 这是我一直使用的。它适用于一切。这不是真正的hack,只是对“零或多个”-“一加零或多个”=“一个或多个”的修改 (4认同)

dos*_*ter 5

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

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