web-dev-qa-db-ja.com

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

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

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

しかし、それは機能していません。何が足りないの?

247
WildBill

代わりにtrを使用してください。

tr , '\n' < file
311

$'string'を使う

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

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

mac OS X上で動作します。

114
Max Nanasy

あなたのsedの使用法が(私のものがそうであるように)完全に置換表現である傾向があるならば、代わりにPerl -peを使うこともできます。

$ echo 'foo,bar,baz' | Perl -pe 's/,/,\n/g'
foo,
bar,
baz
21
nar8789

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

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

... ^Jは次のようにして行われます。 ctrl+v+j\の前に^Jを気にしてください。

PS、RHELのsedはGNU、MacOSのsedはFreeBSDベースであることを私は知っています。Solarissedについてはよくわかりませんが、これはあらゆるsedでうまくいくと信じています。 YMMVあなたへ….

14
Ramon Rey

どうやら\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
13
user2616677

MacOSは違います。Macのsedでこの問題を解決する方法は2つあります。

  • まず、\'$'\n''\nに置き換えて使用します。MacOSで動作します。

    sed 's/,/\'$'\n''/g' file
    
  • 二つ目は、空の行を使うだけです。

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

7
Cnetwork

完全にするために、これも働きます:

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

私はこの記事に遅れていますが、調査結果を更新するだけです。この答えは、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の場合)

4
user2300875

明確にするために:OSXでのsedのmanページ(10.8; Darwin Kernelバージョン12.4.0)は、次のように述べています。

[...]

シード正規表現

 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.

[...]

だから私は1つがtr - 上で述べたように - あるいは気の利いたものを使わなければならないと思います

sed "s/,/^M
/g"

注:<ctrl> - v、<return>と入力する必要があります。 )viエディタで '^ M'を取得する

2
t3az0r

macOS Mojave上のsedは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だけです。用語を再起動すると、コマンドラインのsedgsedになります。

0
DawnSong
$ echo $PATH | sed -e $'s/:/\\\n/g' 
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin

...

Mojaveで私のために働きます

ちなみに、次の行はWindowsで動作し、パス変数のセミコロンを改行に置き換えます。私のgit binディレクトリにインストールされているツールを使っています。

echo %path% | sed -e $'s/;/\\n/g' | less
0
jlafay