コンマで区切られたIDのファイルがあります。カンマを新しい行に置き換えようとしています。私はもう試した:
sed 's/,/\n/g' file
しかし、それは機能していません。何が欠けていますか?
tr , '\n' < file
-パイプなし。
g
ため、スクリプトの最後には?私はそれなしで同じ動作をします。
コンマで区切られたIDのファイルがあります。カンマを新しい行に置き換えようとしています。私はもう試した:
sed 's/,/\n/g' file
しかし、それは機能していません。何が欠けていますか?
tr , '\n' < file
-パイプなし。
g
ため、スクリプトの最後には?私はそれなしで同じ動作をします。
回答:
tr
代わりに使用:
tr , '\n' < file
tr ',' ';' < input.csv > output.csv
ANSI-Cで引用された文字列を使用する $'string'
sedにアクセスするには、バックスラッシュでエスケープされたリテラルの改行が必要です。少なくともbashでは、$''
文字列は\n
実際の改行に置き換えられますが、改行をエスケープするには、sedが表示するバックスラッシュを2倍にする必要があります。
echo "a,b" | sed -e $'s/,/\\\n/g'
これはすべてのシェルでは機能しないが、最も一般的なシェルでは機能することに注意してください。
echo "a,b" | sed -e $'s/,/\\n/g
。
man bash
。
sed -E $'s/<\\/br>/\\\n/g' file
、gnu-sedをインストールする必要はありません
-e
部分は必要ないようです。
sed 's/,/\
/g'
Mac OS Xで動作します。
どうやら\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
\r
同じではないことに\n
注意してください。これにより、データの操作と使用法が中断する可能性があります。
\r
!
これは、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 '...
それを完全にするために、これも機能します:
echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
tr
はすでに受け入れられている答えであるソリューションを好みます。
\n\r
代わりになぜ\r\n
ですか?\r\n
Windowsで必要な順番を試してみました。ただし、これを実行すると、多くの^M
キャリッジリターン文字がに残されるvim
ので、それだけでは機能しないはずです\n
が、それ\n
だけでは機能しません。
この投稿に遅れましたが、調査結果を更新しています。この回答は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のマンページ(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.
[...]
だから私は誰かが-上記のように-または気の利いたtrを使用する必要があると思います
sed "s/,/^M
/g"
注:viエディターで「^ M」を取得するには、< ctrl> -v、< return>と入力する必要があります
$ echo $PATH | sed -e $'s/:/\\\n/g'
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin
...
Mojaveで私のために働く
tr , '\n'
。おそらく、sedは\n
プレーンテキストとして扱われます。