让我们说“ textfile ”包含以下内容:
lorem$ipsum-is9simply the.dummy text%of-printing
并且您想要在单独的行上打印每个单词。 但是 ,单词不仅应由空格定义,还应由所有非字母数字字符定义。所以结果应该是这样的:
lorem
ipsum
is9simply
the
dummy
text
of
printing
如何使用Bash shell完成此操作?
一些说明:
这不是一个家庭作业问题。
只有空格才能确定单词的简单情况很容易。只需写:
for i in `cat textfile`; do echo $i; done;
将执行此操作,并返回:
lorem$ipsum-is9simply
the.dummy
text%of-printing
对于使用非字母数字字符拆分单词我看过使用IFS环境变量的解决方案(下面的链接),但我想避免使用IFS有两个原因:1)它需要(我认为)将IFS设置为一长串非字母数字字符。 2)我发现它有点难看。
以下是两个相关的Q& As I found
How do I split a string on a delimiter in Bash?
How to split a line into words separated by one or more spaces in bash?
答案 0 :(得分:18)
使用tr命令:
tr -cs 'a-zA-Z0-9' '\n' <textfile
'-c
'用于指定字符的补充; '-s
'挤出了替换品的副本; 'a-zA-Z0-9'
是一组字母数字字符(也可以添加_
?); '\ n'是替换字符(换行符)。您还可以使用区域设置敏感的字符类(并且可能包含比上面列表更多的字符):
tr -cs '[:alnum:]' '\n' <textfile
答案 1 :(得分:3)
$ awk -f splitter.awk < textfile
$ cat splitter.awk
{
count0 = split($0, asplit, "[^a-zA-Z0-9]")
for(i = 1; i <= count0; ++i) { print asplit[i] }
}