我在 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;
}