转换文件内容

转换文件内容

我有以下文件:

Dj Assad;Laurell
Sweat
--
Steve Aoki;BTS
Waste it on me
--
Oliver Heldens;Shungudzo
Fire in my soul
--

我想对其进行改造,以便:

Dj-Assad-Laurell-Sweat
--
Steve-Aoki-BTS-Waste-it-on-me
--
Oliver-Heldens-Shungudzo-Fire-in-my-soul
--

我努力了:

sed -e 's/;/ /g; s/ /-/g' file.txt

但它不会删除换行符。

答案1

尝试这个:

$ <file.txt tr '\n' '\0' | sed 's/\x0--\x0/\n--\n/g' | tr '\0; ' '-'
Dj-Assad-Laurell-Sweat
--
Steve-Aoki-BTS-Waste-it-on-me
--
Oliver-Heldens-Shungudzo-Fire-in-my-soul
--
  • <file.txt tr '\n' '\0'将所有\n(换行符)转换为\0(NULL)字符
  • | sed 's/\x0--\x0/\n--\n/g'转换\0--\0\n--\n
  • | tr '\0; ' '-'将剩余的 NULL、分号和空格字符转换为-

答案2

你也可以尝试

tr '\n' '-' <file | sed -e 's/[ ;]\+/-/g' -e 's/----/\n--\n/g'

首先,它将替换换行符-,然后 sed 将删除空格和分号,-最后--将重新创建行。

答案3

那这个呢:

sed -i -e 'N;N;s/\(;[a-zA-Z]*\)\n/\1-/g; s/[ ;]/-/g' foo

编辑:添加分号转换。

答案4

Awk 的几个选项:

awk 'BEGIN{RS="\n--\n"; ORS=RS; FS="[ ;]|\n"; OFS="-"} {NF+=0} 1' file.txt
Dj-Assad-Laurell-Sweat
--
Steve-Aoki-BTS-Waste-it-on-me
--
Oliver-Heldens-Shungudzo-Fire-in-my-soul
--

或(GNU Awk 特定):

$ gawk 'BEGIN{RS="\n--\n"; ORS=RS; FPAT="[[:alnum:]]+"; OFS="-"} {NF+=0} 1' file.txt
Dj-Assad-Laurell-Sweat
--
Steve-Aoki-BTS-Waste-it-on-me
--
Oliver-Heldens-Shungudzo-Fire-in-my-soul
--

相关内容