用换行符/段落标记替换所有空格以生成单词列表

时间:2009-12-05 18:31:08

标签: regex sed

我正在尝试为我们在课堂上翻译的希腊文字词汇表。我想用段落标记替换每个空格或制表符,以便每个单词都出现在它自己的行上。任何人都可以给我sed命令,并解释我在做什么?我还在努力想出去。

8 个答案:

答案 0 :(得分:92)

对于相当现代的sed版本,编辑标准输入以使用

生成标准输出
$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g'
τέχνη
βιβλίο
γη
κήπος

如果您的词汇单词位于名为lesson1lesson2的文件中,请使用

将sed的标准输出重定向到文件all-vocab
sed -E -e 's/[[:blank:]]+/\n/g' lesson1 lesson2 > all-vocab

含义:

  • 字符类 [[:blank:]]匹配单个空格字符或 单个制表符。
    • 使用[[:space:]]来匹配任何单个空白字符(通常是空格,制表符,换行符,回车符,换页符和垂直制表符)。
    • +量词表示匹配上一个模式中的一个或多个
    • 因此[[:blank:]]+是一个包含所有空格或制表符的一个或多个字符的序列。
  • 替换中的\n是您想要的换行符。
  • 末尾的/g修饰符表示尽可能多次执行替换,而不是仅执行一次。
  • -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

sed -e 's/\s\+/\n/g' old > new

这些命令从文件old读取输入,并将结果写入当前目录中名为new的文件。

最大便携性,最大无效性

Version 7 Unix开始回到几乎任何版本的sed,命令调用更加巴洛克式。

$ echo 'τέχνη βιβλίο γη κήπος' | sed -e 's/[ \t][ \t]*/\
/g'
τέχνη
βιβλίο
γη
κήπος

注意:

  • 在这里,我们甚至不假设存在简陋的+量词,并使用单个空格或制表符([ \t])进行模拟,后跟零个或多个({{1} })。
  • 同样,假设sed不理解换行符[ \t]*,我们必须逐字地将它包含在命令行中。
    • \n和命令第一行的结尾是一个延续标记,它会转移紧跟在后面的换行符,并且命令的其余部分位于下一行。
      • 注意:转义换行符之前必须没有空格。也就是说,第一行的结尾必须是完全反斜杠,然后是行尾。
    • 这个容易出错的过程有助于理解为什么世界会转移到可见角色,并且您需要谨慎使用复制粘贴来尝试命令。

关于反斜杠和引用的注释

上面的命令都使用单引号(\)而不是双引号('')。考虑:

""

也就是说,与双引号字符串相比,shell对单引号字符串应用了不同的转义规则。您通常希望使用单个引号保护正则表达式中常见的所有反斜杠。

答案 1 :(得分:56)

可行的方法是:

sed -e 's/[ \t][ \t]*/\
/g'

这是反斜杠和斜杠之间的实际换行符。许多sed实现不了解\n,因此您需要一个文字换行符。换行符之前的反斜杠可防止sed对换行符感到不安。 (在sed脚本中,命令通常由换行符终止)

使用GNU sed,您可以在替换中使用\n,在正则表达式中使用\ s:

sed -e 's/\s\s*/\n/g'

GNU sed还支持“扩展”正则表达式(即egrep样式,而不是perl样式),如果你给它-r标志,那么你可以使用+

sed -r -e 's/\s+/\n/g'

如果这只适用于Linux,你可以使用GNU命令,但是如果你想让它在非GNU sed的系统上工作(例如:BSD,Mac OS-X),你可能想要去使用更便携的选项。

答案 2 :(得分:9)

上面列出的sed的所有示例都在一个平台或另一个平台上中断。它们都不适用于Mac上附带的sed版本。

然而,Perl的正则表达式在安装了Perl的任何机器上都是一样的:

perl -pe 's/\s+/\n/g' file.txt

如果要保存输出:

perl -pe 's/\s+/\n/g' file.txt > newfile.txt

如果您只想要单独出现的单词:

perl -pe 's/\s+/\n/g' file.txt | sort -u > newfile.txt

答案 3 :(得分:6)

  1. 选项1

    echo $(cat testfile)
    
  2. 选项2

    tr ' ' '\n' < testfile
    

答案 4 :(得分:4)

这应该做的工作:

sed -e 's/[ \t]+/\n/g'

[ \t]表示空格或制表符。如果您想要任何类型的空间,也可以使用\s

[ \t]+表示您想要的空格或标签数量(但至少有一个)

s/x/y/表示将模式x替换为y(此处\n是新行)

最后的g意味着您必须重复每行中出现的次数。

答案 5 :(得分:4)

您可以使用POSIX [[:blank:]]来匹配水平空格字符。

sed 's/[[:blank:]]\+/\n/g' file

或者您也可以使用[[:space:]]代替[[:blank:]]

示例:

$ echo 'this  is a sentence' | sed 's/[[:blank:]]\+/\n/g'
this
is
a
sentence

答案 6 :(得分:2)

您也可以使用xargs

执行此操作
cat old | xargs -n1 > new

xargs -n1 < old > new

答案 7 :(得分:0)

使用gawk

gawk '{$1=$1}1' OFS="\n" file