コンマで区切られたidのファイルがあります。コンマを新しい行に置き換えようとしています。私はもう試した:
sed 's/,/\n/g' file
しかし、それは機能していません。何が足りないの?
代わりにtr
を使用してください。
tr , '\n' < file
$'string'
を使う
Sedに到達するには、バックスラッシュでエスケープされたリテラル改行が必要です。少なくともbashでは、$''
文字列は\n
を実際の改行に置き換えますが、sedが改行をエスケープするために必要なバックスラッシュを2倍にする必要があります。
echo "a,b" | sed -e $'s/,/\\\n/g'
sed 's/,/\
/g'
mac OS X上で動作します。
あなたのsedの使用法が(私のものがそうであるように)完全に置換表現である傾向があるならば、代わりにPerl -pe
を使うこともできます。
$ echo 'foo,bar,baz' | Perl -pe 's/,/,\n/g'
foo,
bar,
baz
これは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あなたへ….
どうやら\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
MacOSは違います。Macのsedでこの問題を解決する方法は2つあります。
まず、\'$'\n''
を\n
に置き換えて使用します。MacOSで動作します。
sed 's/,/\'$'\n''/g' file
二つ目は、空の行を使うだけです。
sed 's/,/\
/g' file
Ps。 '
で区切られた範囲に注意してください
完全にするために、これも働きます:
echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
私はこの記事に遅れていますが、調査結果を更新するだけです。この答えは、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の場合)
明確にするために: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'を取得する
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
だけです。用語を再起動すると、コマンドラインのsed
はgsed
になります。
$ 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