MacOSのsedでコンマを改行に置き換えますか?


286

コンマで区切られたIDのファイルがあります。カンマを新しい行に置き換えようとしています。私はもう試した:

sed 's/,/\n/g' file

しかし、それは機能していません。何が欠けていますか?


12
試してくださいtr , '\n'。おそらく、sedは\nプレーンテキストとして扱われます。
ジョンウェスリー王子

1
うまくいきました!猫ファイル| tr、 '\ n'
WildBill

7
tr , '\n' < file-パイプなし。
ジョンウェスリー王子

何であるgため、スクリプトの最後には?私はそれなしで同じ動作をします。
HelloGoodbye 2015年

どのシェルを使用していますか?これは、bashシェルを使用して動作します。
HelloGoodbye 2015年

回答:


361

tr代わりに使用:

tr , '\n' < file

「。」の置き換えを探していました。期間、そしてこれが私が探している解決策でした:)
ジョナ

1
bashシェルでは問題ありません$ tr、 '\ n' aitr使用法:tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
学習者

5
セミコロンでカンマを交換することも動作します:tr ',' ';' < input.csv > output.csv
ヴィムDeblauwe

304

ANSI-Cで引用された文字列を使用する $'string'

sedにアクセスするには、バックスラッシュでエスケープされたリテラルの改行が必要です。少なくともbashでは、$''文字列は\n実際の改行に置き換えられますが、改行をエスケープするには、sedが表示するバックスラッシュを2倍にする必要があります。

echo "a,b" | sed -e $'s/,/\\\n/g'

これはすべてのシェルでは機能しないが、最も一般的なシェルは機能することに注意してください。


5
奇妙なことに、バックスラッシュが1つ少ない、つまりでも動作しますecho "a,b" | sed -e $'s/,/\\n/g
Alexandre Holden Daly 2014

2
賛成。詳細については、の「QUOTING」セクションを参照してくださいman bash
tboyce12

7
OSX 10.11で動作するようになりました:sed -E $'s/<\\/br>/\\\n/g' file、gnu-sedをインストールする必要はありません
Brice

2
指定された例を使用して、OS X 10.7での動作を確認しました。その-e部分は必要ないようです。
Yongwei Wu

1
答えの例は、OSX 10.11.5
Jurriaan Roelofs

122
sed 's/,/\
/g'

Mac OS Xで動作します。


3
これをありがとう-なぜ私の古いLinuxトリックがOSXで機能しないのか不思議に思いました。しかし、これはそうです!
Wyatt8740 2014年

6
これは、sedスクリプトで機能する唯一のソリューションです。
Firstrock 2014年

6
バックスラッシュリテラルの改行をエスケープすることに注意してください(コマンドのターミネーターではないため)。これは、行継続文字ではありません(bashなど)。違いを確認するには、引用符なしで上記のコマンドを記述してください。バックスラッシュはシェルによって行継続文字として解釈され、改行は破棄されます。逆に、引用符で囲まれた式(引用符なし)の内容を別のコンマからnewline.sedファイル(シェル構文を排除)に含めれば、動作します!
Nils von Barth

1
キャラクターではなく、何でも置き換えることができるので、これは良いことです。trは文字だけで動作するようです。文字列を最初のパラメータとして指定すると、文字列ではなく、出現するすべての文字が置き換えられます。
ショーン

1
@Droogans bash、sh、または別のシェルを使用していますか?二重引用符の代わりに単一引用符を使用していますか?
Max Nanasy

22

sedの使用が完全に置換式である傾向がある場合(私のように)、perl -pe代わりに使用することもできます

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz

15

どうやら\r鍵です!

$ sed 's/, /\r/g' file3.txt > file4.txt

これを変換:

ABFS, AIRM, AMED, BOSC, CALI, ECPG, FRGI, GERN, GTIV, HSON, IQNT, JRCC, LTRE,
MACK, MIDD, NKTR, NPSP, PME, PTIX, REFR, RSOL, UBNT, UPI, YONG, ZEUS

これに:

ABFS
AIRM
AMED
BOSC
CALI
ECPG
FRGI
GERN
GTIV
HSON
IQNT
JRCC
LTRE
MACK
MIDD
NKTR
NPSP
PME
PTIX
REFR
RSOL
UBNT
UPI
YONG
ZEUS

OS Xについての質問ですが、これはGNU sed-4.2.2-6.fc20.x86_64では機能しません。
クリスティアンCiupitu 2014年

10
これはと\r同じではないことに\n注意してください。これにより、データの操作と使用法が中断する可能性があります。
Joel Purra、2014年

3
これでうまくいきませんでした。改行があるはずの場所に「r」が表示されました。
フランク

あなたはこれが与える答えでより明確にする必要があります\r
ピル2017

それは私にとってはうまくいきましたが、なぜだろうと思います!\ nはunixの標準であるstackoverflow.com/questions/1761051/difference-between-n-and-r
Alex

15

これは、MacOS Mountain Lion(10.8)、Solaris 10(SunOS 5.10)、およびRHE Linux(Red Hat Enterprise Linux Serverリリース5.3、Tikanga)で動作します...

$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt

...どこ^J行うことによって行われますctrl+ v+ j\前に気にしてください^J

PS、RHELのsedはGNU、MacOSのsedはFreeBSDベースであることを知っています。Solarisのsedについてはよくわかりませんが、これはどのsedでもかなりうまくいくと思います。YMMV tho '...


12

MacOSは異なります。Macのsedでこの問題を解決するには2つの方法があります。

  • まず、\'$'\n''replaceを使用します。MacOS \nで機能します。

    sed 's/,/\'$'\n''/g' file
    
  • 2番目は、空の行を使用するだけです。

    sed 's/,/\
    /g' file
    
  • Ps。で区切られた範囲に注意してください '

  • 3番目は、mac-sedの代わりにgnu-sedを使用します


7

それを完全にするために、これも機能します:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"

1
これは、Bashである場合を除き、難読化されたCコンテストにも適しています;)
Aaron R.

@AaronR。同意する :-)。確かに私trはすでに受け入れられている答えであるソリューションを好みます。
ryenus 14年

1
これはOS Xで機能しました。\n\r代わりになぜ\r\nですか?\r\nWindowsで必要な順番を試してみました。ただし、これを実行すると、多くの^Mキャリッジリターン文字がに残されるvimので、それだけでは機能しないはずです\nが、それ\nだけでは機能しません。
NobleUplift 2017年

4

この投稿に遅れましたが、調査結果を更新しています。この回答はMac OS X専用です

$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern

上記のコマンドで、Shift + Enterを使用して、動作しない新しい行を追加しようとしました。そこで今回は、エラーで言われた「エスケープされていない改行」を「エスケープ」してみました。

$ sed 's/new/\
> /g' m1.json > m2.json 

働きました!(Mac OS X 10.9.3の場合)


これは、あなたの2年前のMax Nanasyの回答と同じです。
miken32

2

明確にするために:OSX上のsedのマンページ(10.8; Darwin Kernelバージョン12.4.0)はこう言っています:

[...]

Sed正規表現

 The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended
 (modern) regular expressions can be used instead if the -E flag is given.  In addition, sed has the following two additions to regular
 expressions:

 1.   In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression.
      Also, putting a backslash character before the delimiting character causes the character to be treated literally.  For example, in the
      context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is
      ``abcxdef''.

 2.   The escape sequence \n matches a newline character embedded in the pattern space.  You cannot, however, use a literal newline charac-
      ter in an address or in the substitute command.

[...]

だから私は誰かが-上記のように-または気の利いたtrを使用する必要があると思います

sed "s/,/^M
/g"

注:viエディターで「^ M」を取得するには、< ctrl> -v、< return>と入力する必要があります



1

sedmacOS Mojaveで2005年にリリースされたので、1つの解決策はgnu-sed

brew install gnu-sed

それから使用gsedはあなたが望むように行います、

gsed 's/,/\n/g' file

必要に応じてsed、単にsudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'、それが推奨されbrew info gnu-sedます。用語を再起動すると、sedinコマンドラインはになりgsedます。


0

FWIW、次の行はウィンドウで機能し、パス変数のセミコロンを改行に置き換えます。私はgit binディレクトリにインストールされているツールを使用しています。

echo %path% | sed -e $'s/;/\\n/g' | less
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.