我应该编写一个正则表达式,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
开头的行,前面有可选的空格或制表符。一旦找到这样的行,它就会删除该行末尾前面的空格(如果存在),然后在该行末尾附加一个空格 和 。+
-
\\
\\
这样,我们就不会添加\\
到已经有该字符串的行的末尾。