Regex 将字符串中的特定子字符串与sed匹配

Regex 将字符串中的特定子字符串与sed匹配,regex,bash,sed,Regex,Bash,Sed,我有一个文件夹,里面有epub格式的电子书,它们的名字是“书的标题”和“作者的名字”。我必须交换电子书名字的两部分,这样它们就变成了“作者的名字——书的标题”。我编写了这个命令,它几乎适用于所有情况: ls *.epub | sed 's/^\([^-]*\)-_\([^.]*\)/\2-\1/' | sed -E 's/.(.epub)$/\1/g' 我将解释代码。首先我列出文件夹中的所有epub文件,然后匹配书的标题和作者,交换它们,最后删除书标题末尾的u。 这在几乎所有情况下都有效,但当

我有一个文件夹,里面有epub格式的电子书,它们的名字是“书的标题”和“作者的名字”。我必须交换电子书名字的两部分,这样它们就变成了“作者的名字——书的标题”。我编写了这个命令,它几乎适用于所有情况:

ls *.epub | sed 's/^\([^-]*\)-_\([^.]*\)/\2-\1/' | sed -E 's/.(.epub)$/\1/g'
我将解释代码。首先我列出文件夹中的所有epub文件,然后匹配书的标题和作者,交换它们,最后删除书标题末尾的u。
这在几乎所有情况下都有效,但当书名包含一个-这不起作用。如何匹配子字符串而不是仅匹配此字符-?我想这会解决我的问题。

如果我正确理解了你的问题,这个
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

非常感谢你。