我正在尝试为我们在课堂上翻译的希腊文字词汇表.我想用段落标记替换每个空格或制表符,以便每个单词都出现在它自己的行上.任何人都可以给我sed命令,并解释我在做什么?我还在努力想出去.
Gre*_*con 94
对于相当现代的sed版本,编辑标准输入以产生标准输出
$ echo '????? ?????? ?? ?????' | sed -E -e 's/[[:blank:]]+/\n/g'
?????
??????
??
?????
Run Code Online (Sandbox Code Playgroud)
如果你的词汇是命名的文件lesson1
和lesson2
,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兼容的正则表达式和支持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]*
.\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),你可能想要更多便携式选择.
上面列出的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
echo $(cat testfile)
Run Code Online (Sandbox Code Playgroud)选项2
tr ' ' '\n' < testfile
Run Code Online (Sandbox Code Playgroud)这应该做的工作:
sed -e 's/[ \t]+/\n/g'
Run Code Online (Sandbox Code Playgroud)
[ \t]
表示空格或制表符。如果你想要任何类型的空间,你也可以使用\s
.
[ \t]+
表示任意数量的空格或制表符(但至少有一个)
s/x/y/
表示用 y 替换模式 x(这里\n
是一个新行)
将g
在最后的手段,你必须重复,因为它在每行中出现了很多次。
归档时间: |
|
查看次数: |
150184 次 |
最近记录: |