编写 sed 命令

编写 sed 命令

我应该编写一个正则表达式,sed使得第一个非空白字符为 a+或 a的每一行都-必须以空格和 结尾\\。例如,一行看起来像:

    -u, -\hspace{.01cm}-unset name

必须变成:

    -u, -\hspace{.01cm}-unset name \\

我尝试这样做:

/^[       ]- s/$/ \\\\/g 

但它不起作用。我怎样才能做到这一点?

答案1

考虑这个测试文件:

$ cat testfile 
-u, -\hspace{.01cm}-unset name
 u, -\hspace{.01cm}-unset name
+u, -\hspace{.01cm}-unset name

考虑这个sed命令:

$ sed '/^[[:blank:]]*[-+]/ s/$/ \\\\/' testfile
-u, -\hspace{.01cm}-unset name \\
 u, -\hspace{.01cm}-unset name
+u, -\hspace{.01cm}-unset name \\

/^[[:blank:]]*[-+]/选择第一个非空白或制表符为-或 的行+。对于这些行,替换命令会添加\\到行尾。

或者,如果您只想\输出一个:

$ sed '/^[[:blank:]]*[-+]/ s/$/ \\/' testfile
-u, -\hspace{.01cm}-unset name \
 u, -\hspace{.01cm}-unset name
+u, -\hspace{.01cm}-unset name \

请注意,这[:blank:]是一个匹配空格和制表符的 unicode 安全字符类。

答案2

$ cat file
    -u, -\hspace{.01cm}-unset name
     u, -\hspace{.01cm}-unset name
    +u, -\hspace{.01cm}-unset name \\

    -u, -\hspace{.01cm}-unset name \\
     u, -\hspace{.01cm}-unset name \\
    +u, -\hspace{.01cm}-unset name

$ sed -E '/^[[:blank:]]*[+-]/s/( \\\\)?$/ \\\\/' file
    -u, -\hspace{.01cm}-unset name \\
     u, -\hspace{.01cm}-unset name
    +u, -\hspace{.01cm}-unset name \\

    -u, -\hspace{.01cm}-unset name \\
     u, -\hspace{.01cm}-unset name \\
    +u, -\hspace{.01cm}-unset name \\

上面的命令定位以 a或sed开头的行,前面有可选的空格或制表符。一旦找到这样的行,它就会删除该行末尾前面的空格(如果存在),然后在该行末尾附加一个空格 和 。+-\\\\

这样,我们就不会添加\\到已经有该字符串的行的末尾。

相关内容