61

我有以下格式的字符串:

string1:string2:string3:string4:string5

我正在尝试使用sed拆分字符串:并将每个子字符串打印在新行上。这是我正在做的事情:

cat ~/Desktop/myfile.txt | sed s/:/\\n/

这打印:

string1
string2:string3:string4:string5

我怎样才能让它在每个分隔符上拆分?

4

6 回答 6

83

要使用 GNU sed 使用分隔符拆分字符串,您可以说:

sed 's/delimiter/\n/g'     # GNU sed

例如,使用:分隔符进行拆分:

$ sed 's/:/\n/g' <<< "he:llo:you"
he
llo
you

或者使用非 GNU sed:

$ sed $'s/:/\\\n/g' <<< "he:llo:you"
he
llo
you

在这种特殊情况下,您错过了g替换后的。因此,它只进行一次。看:

$ echo "string1:string2:string3:string4:string5" | sed s/:/\\n/g
string1
string2
string3
string4
string5

g代表global 并且意味着必须在全局范围内进行替换,即对于任何情况。看到默认值是 1,如果你输入例如 2,它会执行 2 次,等等。

总之,在您的情况下,您需要使用:

sed 's/:/\\n/g' ~/Desktop/myfile.txt

请注意,您可以直接使用sed ... file语法,而不是不必要的管道:cat file | sed.

于 2013-08-14T14:24:05.680 回答
34

使用\ninsed是不可移植的。做你想做的事的便携方式sed是:

sed 's/:/\
/g' ~/Desktop/myfile.txt

但实际上这sed无论如何都不是一份工作,而是tr创建这项工作:

tr ':' '
' < ~/Desktop/myfile.txt
于 2013-08-14T14:32:04.457 回答
25

简单地使用

$ tr ':' $'\n' <<< string1:string2:string3:string4:string5
string1
string2
string3
string4
string5

如果你真的需要

$ sed 's/:/\n/g' <<< string1:string2:string3:string4:string5
string1
string2
string3
string4
string5
于 2013-08-14T16:46:43.527 回答
4

这可能对您有用(GNU sed):

sed 'y/:/\n/' file

也许:

sed y/:/$"\n"/ file
于 2013-08-14T15:33:12.270 回答
0

如果您使用的是 gnu sed,那么您可以使用\x0A换行符:

sed 's/:/\x0A/g' ~/Desktop/myfile.txt
于 2013-08-14T14:39:44.660 回答
0

这应该这样做:

cat ~/Desktop/myfile.txt | sed s/:/\\n/g
于 2013-08-14T14:27:00.520 回答