web-dev-qa-db-ja.com

sedを使用して区切り文字で文字列を分割する

次の形式の文字列があります。

string1:string2:string3:string4:string5

sedを使用して:で文字列を分割し、各サブ文字列を新しい行に出力しようとしています。ここに私がやっていることがあります:

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

これは印刷します:

string1
string2:string3:string4:string5

区切り文字ごとに分割するにはどうすればよいですか?

46
hax0r_n_code

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

gglobalの略で、置換はグローバルに、つまりすべての発生に対して行われる必要があることを意味します。デフォルトが1であり、たとえば2を指定すると、2回実行されるなどのことを確認してください。

すべて一緒に、あなたの場合には、使用する必要があります:

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

不要なパイピングsed ... fileの代わりに、cat file | sed構文を直接使用できることに注意してください。

59
fedorqui

sed\nを使用することは移植できません。 sedで必要なことを行うポータブルな方法は次のとおりです。

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

しかし、実際にはこれはsedの仕事ではありません。とにかく、trの仕事です:

tr ':' '
' < ~/Desktop/myfile.txt
27
Ed Morton

単に tr を使用する場合:

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

本当に必要な場合 sed

$ sed 's/:/\n/g' <<< string1:string2:string3:string4:string5
string1
string2
string3
string4
string5
23
Gilles Quenot

これはあなたのために働くかもしれません(GNU sed):

sed 'y/:/\n/' file

多分:

sed y/:/$"\n"/ file
3
potong

これはそれを行う必要があります:

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

Gnu sedを使用している場合、改行に\x0Aを使用できます。

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