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

Dav*_*idR 63 regex sed

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

Gre*_*con 94

对于相当现代的sed版本,编辑标准输入以产生标准输出

$ echo '????? ?????? ?? ?????' | sed -E -e 's/[[:blank:]]+/\n/g'
?????
??????
??
?????
Run Code Online (Sandbox Code Playgroud)

如果你的词汇是命名的文件lesson1lesson2,sed的重定向的标准输出到文件all-vocab

sed -E -e 's/[[:blank:]]+/\n/g' lesson1 lesson2 > all-vocab
Run Code Online (Sandbox Code Playgroud)

这是什么意思:

  • 字符类 [[: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
Run Code Online (Sandbox Code Playgroud)

要么

sed -e 's/\s\+/\n/g' old > new
Run Code Online (Sandbox Code Playgroud)

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

最大的便携性,最大的无效性

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

$ echo '????? ?????? ?? ?????' | sed -e 's/[ \t][ \t]*/\
/g'
?????
??????
??
?????
Run Code Online (Sandbox Code Playgroud)

笔记:

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

关于反斜杠和引用的注释

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

$ echo '\\\\' "\\\\"
\\\\ \\
Run Code Online (Sandbox Code Playgroud)

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


Lau*_*ves 56

可行的方法是:

sed -e 's/[ \t][ \t]*/\
/g'
Run Code Online (Sandbox Code Playgroud)

这是反斜杠和斜杠之间的实际换行符.许多sed实现都不知道\n,所以你需要一个文字换行符.换行符之前的反斜杠可防止sed对换行符感到不安.(在sed脚本中,命令通常由换行符终止)

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

sed -e 's/\s\s*/\n/g'
Run Code Online (Sandbox Code Playgroud)

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

sed -r -e 's/\s+/\n/g'
Run Code Online (Sandbox Code Playgroud)

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


Ear*_*uby 9

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

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

perl -pe 's/\s+/\n/g' file.txt
Run Code Online (Sandbox Code Playgroud)

如果要保存输出:

perl -pe 's/\s+/\n/g' file.txt > newfile.txt
Run Code Online (Sandbox Code Playgroud)

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

perl -pe 's/\s+/\n/g' file.txt | sort -u > newfile.txt
Run Code Online (Sandbox Code Playgroud)


小智 7

  1. 选项1

    echo $(cat testfile)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 选项2

    tr ' ' '\n' < testfile
    
    Run Code Online (Sandbox Code Playgroud)


Tri*_*ner 5

这应该做的工作:

sed -e 's/[ \t]+/\n/g'
Run Code Online (Sandbox Code Playgroud)

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

[ \t]+ 表示任意数量的空格或制表符(但至少有一个)

s/x/y/表示用 y 替换模式 x(这里\n是一个新行)

g在最后的手段,你必须重复,因为它在每行中出现了很多次。