对于相当现代的 sed 版本,编辑标准输入以产生标准输出:
$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g'
τέχνη
βιβλίο
γη
κήπος
如果您的词汇表单词位于名为lesson1
and lesson2
, 将 sed 的标准输出重定向到文件all-vocab
with
sed -E -e 's/[[:blank:]]+/\n/g' lesson1 lesson2 > all-vocab
这是什么意思:
- The character class
[[:blank:]]
matches either a single space character or
a single tab character.
- Use
[[:space:]]
而是匹配任何单个空白字符(通常是空格、制表符、换行符、回车符、换页符和垂直制表符)。
- The
+
量词的意思匹配一个或多个先前的模式.
- So
[[:blank:]]+
是一个或多个字符的序列,全部为空格或制表符。
- The
\n
替换中是您想要的换行符。
- The
/g
末尾的修饰符意味着尽可能多次地执行替换,而不仅仅是一次。
- The
-E
选项告诉 sed 使用 POSIX 扩展正则表达式语法,特别是对于这种情况+
量词。没有-E
,你的 sed 命令变成sed -e 's/[[:blank:]]\+/\n/g'
。 (注意使用\+
而不是简单的+
.)
Perl 兼容的正则表达式
对于熟悉 Perl 兼容正则表达式和支持 PCRE 的 sed 的人,请使用\s+
匹配至少一个空白字符的运行,如
sed -E -e 's/\s+/\n/g' old > new
or
sed -e 's/\s\+/\n/g' old > new
这些命令从文件中读取输入old
并将结果写入名为的文件new
在当前目录中。
最大的便携性,最大的粗糙度
回到几乎所有版本的 sed版本 7 Unix https://en.wikipedia.org/wiki/Version_7_Unix,命令调用有点巴洛克风格。
$ echo 'τέχνη βιβλίο γη κήπος' | sed -e 's/[ \t][ \t]*/\
/g'
τέχνη
βιβλίο
γη
κήπος
Notes:
- 在这里我们甚至不假设谦卑者的存在
+
量词并用单个空格或制表符模拟它([ \t]
)后跟零个或多个([ \t]*
).
- Similarly, assuming sed does not understand
\n
for newline, we have to include it on the command line verbatim.
- The
\
and the end of the first line of the command is a continuation marker that escapes the immediately following newline, and the remainder of the command is on the next line.
-
Note:转义换行符前面不能有空格。也就是说,第一行的结尾必须是exactly反斜杠后跟行尾。
- 这个容易出错的过程可以帮助人们理解为什么世界转移到可见字符,并且您在尝试使用复制和粘贴命令时需要小心一些。
关于反斜杠和引号的注意事项
上面的命令都使用单引号 (''
) 而不是双引号 (""
)。考虑:
$ echo '\\\\' "\\\\"
\\\\ \\
也就是说,与双引号字符串相比,shell 对单引号字符串应用不同的转义规则。您通常希望保护正则表达式中常见的所有反斜杠single quotes.