用换行符/段落符号replace所有的空格来创build一个单词列表
我正在尝试为我们在课堂上翻译的希腊语文字进行词汇表。 我想用段落标记replace每个空格或制表符,以便每个单词出现在自己的行上。 任何人都可以给我sed命令,并解释我在做什么? 我仍然试图找出结果。
对于合理的现代版本的sed,编辑标准input以产生标准输出
$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g' τέχνη βιβλίο γη κήπος
如果您的词汇单词在名为lesson2
和lesson2
文件中, lesson2
sed的标准输出redirect到文件all-vocab
sed -E -e 's/[[:blank:]]+/\n/g' lesson1 lesson2 > all-vocab
这是什么意思:
- 字符类
[[:blank:]]
匹配单个空格字符或单个制表符。- 使用
[[:space:]]
来匹配任何单个空格字符(通常是空格,制表符,换行符,回车符,换页符和垂直制表符)。 -
+
量词意味着匹配一个或多个先前的模式 。 - 所以
[[:blank:]]+
是一个或多个空格或制表符的字符序列。
- 使用
- replace中的
\n
是你想要的换行符。 - 末尾的
/g
修饰符意味着尽可能多地执行replace,而不仅仅是一次。 -
-E
选项告诉sed使用POSIX扩展正则expression式语法,特别是在这种情况下+
量词。 没有-E
,你的sed命令变成sed -e 's/[[:blank:]]\+/\n/g'
。 (注意使用\+
而不是简单的+
。)
Perl兼容的正则expression式
对于熟悉兼容Perl的正则expression式和具有PCRE能力的sed,使用\s+
匹配至less一个空格字符的运行,如
sed -E -e 's/\s+/\n/g' old > new
要么
sed -e 's/\s\+/\n/g' old > new
这些命令从old
文件读取input,并将结果写入当前目录中名为new
的文件。
最大的可移植性,最大的可移植性
回到版本7 Unix以来几乎任何版本的sed,命令调用都是更加巴洛克式的。
$ echo 'τέχνη βιβλίο γη κήπος' | sed -e 's/[ \t][ \t]*/\ /g' τέχνη βιβλίο γη κήπος
笔记:
- 在这里,我们甚至不假设谦虚
+
量词的存在,并用一个空格或标签([ \t]
)来模拟,然后是零个或多个([ \t]*
)。 - 同样,假设sed不理解
\n
换行,我们必须逐字将它包含在命令行中。- 该命令的第一行的结尾是一个继续标记,它将转义紧随的换行符,而其余的命令则在下一行。
- 注意:转义换行符之前不能有空格。 也就是说,第一行的结尾必须是正好反斜杠,后面是行尾。
- 这个容易出错的过程可以帮助人们理解为什么世界移动到可见的字符,你会想要尝试一些复制和粘贴的命令。
- 该命令的第一行的结尾是一个继续标记,它将转义紧随的换行符,而其余的命令则在下一行。
请注意反斜杠和引用
上面的命令都使用单引号( ''
)而不是双引号( ""
)。 考虑:
$ echo '\\\\' "\\\\" \\\\ \\
也就是说,与双引号string相比,shell对单引号string应用不同的转义规则。 您通常要用单引号保护正则expression式中的所有反斜杠。
便携式的方法是:
sed -e 's/[ \t][ \t]*/\ /g'
这是反斜杠和斜杠之间的实际换行符。 许多sed实现不知道\n
,所以你需要一个字面的换行符。 换行符之前的反斜杠可防止sed对换行符感到不安。 (在sed脚本中,命令通常由换行符终止)
使用GNU sed,您可以在replace中使用\n
,在正则expression式中使用\n
:
sed -e 's/\s\s*/\n/g'
GNU sed也支持“extended”正则expression式(egrep风格,不是perl风格),如果你给它的-r标志,那么你可以使用+
:
sed -r -e 's/\s+/\n/g'
如果仅用于Linux,那么可以使用GNU命令,但是如果您希望在具有非GNU sed(例如:BSD,Mac OS-X)的系统上工作,则可能需要更多便携式选项。
上面列出的所有例子都是在一个平台上进行的。 他们都没有在Mac上运行的sed版本。
然而,Perl的正则expression式在任何安装了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
这应该做的工作:
sed -e 's/[ \t]+/\n/g'
[ \t]
表示空格或标签。 如果你想要任何types的空间,你也可以使用\s
。
[ \t]+
意味着尽可能多的空格或制表符(但至less有一个)
s/x/y/
表示用s/x/y/
replace模式x(这里\n
是一个新行)
最后的g
意味着你必须在每一行中重复多次。
-
选项1
echo $(cat testfile)
-
选项2
tr ' ' '\n' < testfile
你可以使用POSIX [[:blank:]]
来匹配一个水平的空白字符。
sed 's/[[:blank:]]\+/\n/g' file
也可以使用[[:space:]]
而不是[[:blank:]]
。
例:
$ echo 'this is a sentence' | sed 's/[[:blank:]]\+/\n/g' this is a sentence
使用gawk
:
gawk '{$1=$1}1' OFS="\n" file
你也可以用xargs
来做:
cat old | xargs -n1 > new
要么
xargs -n1 < old > new