我正在尝试为我们在课堂上翻译的希腊文字词汇表。我想用段落标记替换每个空格或制表符,以便每个单词都出现在它自己的行上。任何人都可以给我sed命令,并解释我在做什么?我还在努力想出去。
答案 0 :(得分:92)
对于相当现代的sed版本,编辑标准输入以使用
生成标准输出$ echo 'τέχνη βιβλίο γη κήπος' | sed -E -e 's/[[:blank:]]+/\n/g'
τέχνη
βιβλίο
γη
κήπος
如果您的词汇单词位于名为lesson1
和lesson2
的文件中,请使用
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兼容的正则表达式和支持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} })。[ \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
echo $(cat testfile)
选项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