使用sed匹配字符串中的特定子字符串

时间:2017-09-30 22:59:29

标签: regex bash sed

我有一个epub格式的电子书文件夹,其名称的形状为“title_of_the_book _-_ name_of_the_author”。我必须交换电子书名称的两部分,以便它们成为“name_of_the_author-title_of_the_book”。我写过这个命令几乎适用于所有情况:

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

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

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题/问题,这个sed表达式应该可以解决问题:

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

这是假设每个标题 author 分开,并使用固定的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