请问如何理解以下bash脚本?

时间:2014-07-07 12:01:59

标签: bash sed

请问下面的bash脚本试图做什么?

args=$(echo $@ |sed "s/^ *//;s/ *$//;s/ \{1,\}/ /g;s/-\{1,\} /-/g;s/ -/\t-/g")

谢谢!

4 个答案:

答案 0 :(得分:2)

让我们分解一下:

  1. s/^ *//;
  2. s/ *$//;
  3. s/ \{1,\}/ /g;
  4. s/-\{1,\} /-/g;
  5. s/ -/\t-/g

    1。删除行首

    的空格

    2. 删除行尾的空格

    3. 用一个空格替换空格

    4. 以短划线取代破折号

    5. 按标签和短划线替换空格和短划线

答案 1 :(得分:1)

脚本修剪通过命令行传递给脚本的参数。 (可以使用shell中的$@来解决所有参数的数组)

修剪意味着,它会删除字符串中间的冗余空格,并在每个参数的开头和结尾完全删除空格。您的代码将进一步用TAB替换连字符前面的空格。

由命令进行的转换,详细说明:

s/^ *//          --> remove 0 or more spaces at the start of the string
s/ *$//          --> remove 0 or more spaces at the end of the string
/ \{1,\}/ /g     --> "melts" multiple spaces into one
s/-\{1,\} /-/g   --> Removes one or more white space after the hypen `-`
s/ -/\t-/g       --> Removes a space in front of a hypen by a TAB

答案 2 :(得分:1)

让我们把它分成小块,这样更容易理解:

  1. 删除行首的空格

    s/^ *//;
    
  2. 删除行尾的所有空格

    s/ *$//;
    
  3. 用一个空格替换两个或多个空格

    s/ \{1,\}/ /g;
    
  4. 用一个破折号

    替换两个或多个破折号后跟一个空格-
    s/-\{1,\} /-/g;
    
  5. 用标签和短划线-替换空格和短划线\t-

    s/ -/\t-/g
    

答案 3 :(得分:1)

sed清理空格并对其进行更改:

sdfgsdfg
  afadsfads fadsf
adsfadf   adfadfads
adfadfa - adsfdsf
dfadsf - dsfds
dfsd   -   sdfsd

对此:

sed "s/^ *//;s/ *$//;s/ \{1,\}/ /g;s/-\{1,\} /-/g;s/ -/\t-/g" file
sdfgsdfg
afadsfads fadsf
adsfadf adfadfads
adfadfa -adsfdsf
dfadsf  -dsfds
dfsd    -sdfsd

使用awk

可以更简单地完成
awk '{$1=$1;sub(/ - /,"\t-")}1' file
sdfgsdfg
afadsfads fadsf
adsfadf adfadfads
adfadfa -adsfdsf
dfadsf  -dsfds
dfsd    -sdfsd

或者在你的情况下:

args=$(echo $@ | awk '{$1=$1;sub(/ - /,"\t-")}1')
相关问题