批处理之家's Archiver

netdzb 发表于 2019-7-8 14:42

求一个简单的sed命令删除或替换字符串

[i=s] 本帖最后由 netdzb 于 2019-7-8 16:01 编辑 [/i]

list.txt文本内容如下:

01.长亭外
02.怀念战友 电影《冰山上的来客》插曲
03.秋水伊人 电影《古塔奇案》插曲
04.曲蔓地 新疆民歌
05.歌唱二小放牛郎
06.鼓浪屿之波
07.**人永远是年轻 歌剧《星星之火》选曲
08.草原上升起不落的太阳
09.渔光曲 电影《渔光曲》插曲 (推荐曲目)
10.长城谣 (推荐曲目)
11.春天里 电影《十字街头》插曲
In Spring Time
12.可爱的一朵玫瑰花
13.翻身农奴把歌唱 纪录影片《今日西藏》主题歌
14.难忘今宵


要求执行以后成为

长亭外
怀念战友 电影《冰山上的来客》插曲
秋水伊人 电影《古塔奇案》插曲
曲蔓地 新疆民歌
歌唱二小放牛郎
鼓浪屿之波
**人永远是年轻 歌剧《星星之火》选曲
草原上升起不落的太阳
渔光曲 电影《渔光曲》插曲 (推荐曲目)
长城谣 (推荐曲目)
春天里 电影《十字街头》插曲
可爱的一朵玫瑰花
翻身农奴把歌唱 纪录影片《今日西藏》主题歌

netdzb 发表于 2019-7-8 15:05

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=221729&ptid=53285]1#[/url] [i]netdzb[/i] [/b]

又比如,我想把01.替换成dig我用这个命令为啥不对啊?

sed -E "s/^[0-9][0-9]\./dig/g" > list.txt

cfwyy77_bat 发表于 2019-7-8 15:24

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=221730&ptid=53285]2#[/url] [i]netdzb[/i] [/b]

你文件名参数都没有,就直接重定向了。[code]sed -E "s/^[0-9][0-9]\./dig/g" list.txt >list2.txt[/code]

netdzb 发表于 2019-7-8 15:31

[i=s] 本帖最后由 netdzb 于 2019-7-8 15:45 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=221731&ptid=53285]3#[/url] [i]cfwyy77_bat[/i] [/b]

如果想把01.之类的去掉该怎么弄?

自己知道了,应该这样

sed -E "s/^[0-9][0-9]\./''/g" list.txt >list2.txt

还是不对,变成这样了。

''长亭外
''怀念战友 电影《冰山上的来客》插曲
''秋水伊人 电影《古塔奇案》插曲
''曲蔓地 新疆民歌
''歌唱二小放牛郎
''鼓浪屿之波
''**人永远是年轻 歌剧《星星之火》选曲
''草原上升起不落的太阳
''渔光曲 电影《渔光曲》插曲 (推荐曲目)
''长城谣 (推荐曲目)
''春天里 电影《十字街头》插曲
''可爱的一朵玫瑰花
''翻身农奴把歌唱 纪录影片《今日西藏》主题歌

netdzb 发表于 2019-7-8 15:49

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=221731&ptid=53285]3#[/url] [i]cfwyy77_bat[/i] [/b]

终于可以了,是这样写。

sed -E "s/^[0-9][0-9]\.//g" xuan.txt > list.txt

netdzb 发表于 2019-7-8 16:05

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=221731&ptid=53285]3#[/url] [i]cfwyy77_bat[/i] [/b]

是这样的,我想把这个list.txt的歌名替换到cue文件对应的TRACK上面该怎么弄?
别人写的一行的脚本,一是我看不懂,二也跑不通。所以自己想学习写一个。
主要是适合初学者能够理解的写法。

PERFORMER "古璇-《璇曲蔓地(一)XRCD》"
TITLE "古璇-《璇曲蔓地(一)XRCD》"
FILE "璇曲蔓地(一)XRCD.wav" WAVE
  TRACK 01 AUDIO
    TITLE "Track01"
    PERFORMER "古璇"
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    TITLE "Track02"
    PERFORMER "古璇"
    INDEX 00 03:33:24
    INDEX 01 03:36:25
  TRACK 03 AUDIO
    TITLE "Track03"
    PERFORMER "古璇"
    INDEX 00 08:19:67
    INDEX 01 08:25:12
  TRACK 04 AUDIO
    TITLE "Track04"
    PERFORMER "古璇"
    INDEX 00 13:35:39
    INDEX 01 13:39:25
  TRACK 05 AUDIO
    TITLE "Track05"
    PERFORMER "古璇"
    INDEX 00 17:14:33
    INDEX 01 17:18:00
  TRACK 06 AUDIO
    TITLE "Track06"
    PERFORMER "古璇"
    INDEX 00 22:33:05
    INDEX 01 22:36:12
  TRACK 07 AUDIO
    TITLE "Track07"
    PERFORMER "古璇"
    INDEX 00 26:52:47
    INDEX 01 26:57:00
  TRACK 08 AUDIO
    TITLE "Track08"
    PERFORMER "古璇"
    INDEX 00 30:37:06
    INDEX 01 30:40:12
  TRACK 09 AUDIO
    TITLE "Track09"
    PERFORMER "古璇"
    INDEX 00 34:54:04
    INDEX 01 34:58:25
  TRACK 10 AUDIO
    TITLE "Track10"
    PERFORMER "古璇"
    INDEX 00 40:41:51
    INDEX 01 40:44:62
  TRACK 11 AUDIO
    TITLE "Track11"
    PERFORMER "古璇"
    INDEX 00 44:19:69
    INDEX 01 44:24:62
  TRACK 12 AUDIO
    TITLE "Track12"
    PERFORMER "古璇"
    INDEX 00 49:20:24
    INDEX 01 49:23:37
  TRACK 13 AUDIO
    TITLE "Track13"
    PERFORMER "古璇"
    INDEX 00 53:53:22
    INDEX 01 53:56:25
  TRACK 14 AUDIO
    TITLE "Track14"
    PERFORMER "古璇"
    INDEX 00 58:07:20
    INDEX 01 58:10:62

netdzb 发表于 2019-7-8 16:29

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=221734&ptid=53285]5#[/url] [i]netdzb[/i] [/b]

是不是这样就可以了,可是执行结果不对啊。

sed -E "/TRACK[0-9][0-9]/'变量'/g" cue.txt >mycue.txt

执行完成,mycue.txt是空的啊。

cfwyy77_bat 发表于 2019-7-8 17:05

[i=s] 本帖最后由 cfwyy77_bat 于 2019-7-8 17:13 编辑 [/i]

cue文件格式,不是很了解,百度了一下,你要用歌词名 去替换TRACK?这个不对吧, 你想要改的是TITLE 后面的内容吧?
你说别人一行脚本,是什么发出来看看。

netdzb 发表于 2019-7-8 17:27

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=221737&ptid=53285]8#[/url] [i]cfwyy77_bat[/i] [/b]

#!/bin/bash
while read LINE
do
    TITLE=`echo ${LINE#*.} | tr -d '\r'`
    sed -i 's#TITLE "Track'${LINE%%.*}'"#TITLE "'${TITLE}'"#g' b.txt
done < a.txt

这个脚本在msys 1.0通不过。

netdzb 发表于 2019-7-8 17:32

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=221737&ptid=53285]8#[/url] [i]cfwyy77_bat[/i] [/b]

sed -E "s/Track[0-9][0-9]/$变量/" cue.txt > mycue.txt
      
现在我要解决的问题是sed命令如何只替换搜索到第一次的匹配项。
上面的脚本是全部替换掉的,那我从list.txt读取歌名的时候,
只能是被替换了第一首歌名,因为第二次从list.txt读到第2首歌曲的
时候,匹配想的Track都被替换了,匹配不到了。这个到底用什么办法
解决?

cfwyy77_bat 发表于 2019-7-9 08:24

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=221739&ptid=53285]10#[/url] [i]netdzb[/i] [/b]

就按你给的别人脚本,稍改一下,list.txt就按原始的带数字序号的,就应该可以得到你想要的了。我这运行没问题。[code]
#!/bin/bash
while read LINE
do
    TITLE=`echo ${LINE#*.} | tr -d '\r'`
    sed -i "s#TITLE \"Track${LINE%%.*}\"#TITLE \"${TITLE}\"#" cue.txt
done < list.txt
[/code]至于你说全部被替换,当然是这样的,因为替换时的你写的正则是 /Track[0-9][0-9]/  这么写当然所有Track01,Track02...都能匹配,都会被替换的。

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.