2017-09-30 259 views
1

我有一个epub格式的电子书文件夹,它们的名字的形状是“title_of_the_book _-_ name_of_the_author”。我必须交换电子书名称的两部分,以便它们变成“name_of_the_author-title_of_the_book”。我写了几乎适用于所有情况的这个命令:在sed中匹配字符串中的特定子字符串

ls *.epub | sed 's/^\([^-]*\)-_\([^.]*\)/\2-\1/' | sed -E 's/.(.epub)$/\1/g' 

我将解释代码。首先,我列出文件夹中的所有epub文件,然后匹配本书的标题和本书的作者,然后交换它们,最后删除本书标题末尾的_。 这适用于几乎所有情况,但是当书的标题包含 - 这不起作用。我怎么能匹配子字符串_-而不是只是这个字符 - ?我认为这将解决我的问题。

回答

1

如果我正确理解你的问题/问题,这sed表达应该做的伎俩:

sed -E 's/^(.*)_-_(.*)\.epub$/\2-\1.epub/' 

这工作,每一个标题作者有固定3个字符分隔的假设下字符串_-_。我们使用贪婪捕获组(.*),但是锚定了模式的开始和结束,所以我们正确地捕捉了标题和作者。

例如:

$ echo "title_of_the_book_-_name_of_the_author.epub" | sed -E 's/^(.*)_-_(.*)\.epub/\2-\1.epub$/' 
name_of_the_author-title_of_the_book.epub 
$ echo "semi-title_of_the_book_-_name_of_the_author.epub" | sed -E 's/^(.*)_-_(.*)\.epub/\2-\1.epub$/' 
name_of_the_author-semi-title_of_the_book.epub 
相关问题