我有一个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文件,然后我匹配书的标题和书的作者,我交换它们,最后我删除了书的标题末尾的_。 这适用于几乎所有情况,但当书的标题包含 - 这不起作用。我怎样才能匹配子串_-而不仅仅是这个字符 - ?我想这可以解决我的问题。
答案 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