0

我有一个LINES格式如下的变量date;album;song;duration;singer;author;genre

August 2013;MDNA;Falling Free;00:31:40;Madonna;Madonna;Pop
August 2013;MDNA;I don't give a;00:45:40;Madonna;Madonna;Pop
August 2013;MDNA;I'm a sinner;01:00:29;Madonna;Madonna;Pop
August 2013;MDNA;Give Me All Your Luvin';01:15:02;Madonna;Madonna;Pop

我想输出author-song,所以我做了这个脚本:

echo $LINES | sed s_"^[^;]*;[^;]*;\([^;]*\);[^;]*;[^;]*;\([^;]*\)"_"\2-\1"_g

所需的输出是:

Madonna-Falling Free
Madonna-I don't give a
Madonna-I'm a sinner
Madonna-Give Me All Your Luvin'

但是,我得到了这个:

Madonna-Falling Free;Madonna;Pop August 2013;MDNA;I don't give a;00:45:40;Madonna;Madonna;Pop August 2013;MDNA;I'm a sinner;01:00:29;Madonna;Madonna;Pop August 2013;MDNA;Give Me All Your Luvin';01:15:02;Madonna;Madonna;Pop

为什么?

编辑:我需要使用 sed。

4

4 回答 4

3

当我sed在你的输入上运行你的脚本时,我得到这个输出:

Madonna-Falling Free;Pop
Madonna-I don't give a;Pop
Madonna-I'm a sinner;Pop
Madonna-Give Me All Your Luvin';Pop

这很好,除了额外的;Pop- 你只需要添加.*$到你的正则表达式的末尾,以便替换整行。

根据您报告的输出,我猜您的输入文件使用了与sed预期不同的换行符约定。

无论如何,这是一件非常愚蠢的事情sed。更好awk,例如:

awk 'BEGIN {FS=";";OFS="-"} {print $5,$3}'

或者,稍微简洁一点,

awk -F\; -vOFS=- '{print $5,$3}'
于 2013-09-30T03:28:49.827 回答
1

如果要sed查看多行输入,则必须引用要回显的变量:

echo "$LINES" | sed ...

请注意,我什至不会尝试评估您的sed脚本的正确性。在这里使用sed是一种讽刺,因为它awk更适合这项任务。

于 2013-09-30T03:23:29.913 回答
0

看起来 sed 正在将整个示例文本视为一行。所以它正在执行请求的操作,然后保持其余部分不变。
我会先研究换行问题。你是如何填充 $LINES 的?
您还应该将输入(类型)中的第七个字段添加到模式中,以便表达式实际上确实消耗了您想要的所有文本。并且可能将模式的结尾锚定在$\b(单词边界)或(空格\s字符)或\n(换行符)上。

于 2013-09-30T03:18:26.780 回答
0

如果您的格式是绝对永久的,请尝试以下操作:

echo $line | sed 's#.*;.*;\(.*\);.*;.*;\(.*\);.*#\2-\1#'
于 2013-09-30T03:55:25.437 回答