sed/gsed“无效的命令代码。”,“表达式 #1,字符 1:未知命令:`.' ”

sed/gsed“无效的命令代码。”,“表达式 #1,字符 1:未知命令:`.' ”

我在 OS X sed 和 gsed 中都遇到了这些类似的错误,在命令文件中,表达式 1、字符 1 中不包含句点。唯一的位置是“.”。出现在文件的第 5 行,它被转义了。

命令文件如下:

#!/usr/local/bin/gsed -E
/^\s+/ d                        #trim leading spaces
/^$/ d                          #kill blank lines
s/([a-z])\n/\1 /                #unwrap text
s/([\.,;:]) (\w)/\1\r\2/        #CR at flow punctuation

不知道从这里去哪里。无论是作为 shell 脚本运行还是使用 -f 读取命令文件,OS X sed 和 gsed 都会以相同的方式阻塞。我在 SE 和其他地方遇到过其他几个关于“未知命令:‘.’”格式错误的问题。 " 在这些情况下,错误消息中引用的字符位于错误的位置,或者 Mac OS X 上的 -i 命令通常需要参数,但我没有使用 -i 选项。

答案1

#!/usr/local/bin/gsed -E

应该:

#!/usr/local/bin/gsed -Ef

因为您希望sed -Ef /path/to/the/sed-script other arguments在运行时运行sed-script other arguments,而不是sed -E /path/to/the/sed-script other arguments在哪里/path/to/the/sed-script将被视为 sed 代码来解释。

/^\s+/ d                        #trim leading spaces

不,d如果当前行以一个或多个被归类为空白的字符开头,则会删除当前行。要删除这些字符并保留该行,应该是:

 s/^\s+//

或者等效的标准:

 s/^[[:space:]]+//
 s/([a-z])\n/\1 /                #unwrap text

sed一次处理一行模式空间含有内容这些行,不包括行分隔符,因此永远不会匹配,因为模式空间不包含换行符。

另请注意,匹配的字符[a-z]通常是随机的并且受区域设置的影响。

 s/([\.,;:]) (\w)/\1\r\2/        #CR at flow punctuation

还要注意[\.,;:]反斜杠上的匹配。如果您只想匹配,;:,那就是[,;:].您可能还想替换全部出现在需要该g标志的行上。

这是您想要的声音:

#! /usr/bin/env perl
while (<<>>) { # reads one line into $_, includes the line delimiter
  s/^\s+//; # \n is also a \s so empty lines would be stripped in the process
  s/[a-z]\K\n//;
  s/([:;,]) +(\w)/\1\r\2/g;
  print;
}

相关内容