我尝试转换文件名并删除特殊字符和空格。由于某些原因,如果我声明破折号和斜杠不被替换,我的SED正则表达式不起作用。
输入:/path/to/file 20-456 (1).jpg
预期输出:/path/to/file_20-456_1.jpg
范例:echo "/path/to/file 20-456 (1).jpg" | sed -e 's/ /_/g' -e 's/[^0-9a-zA-Z\.\_\-\/]//g'
个
输出量:/path/to/file_20456_1.jpg
个
所以破折号不在里面。当我尝试这个命令时:echo "/path/to/file 20-456 (1).jpg" | sed -e 's/ /_/g' -e 's/[^0-9a-zA-Z\.\_\-]//g'
个
输出量:pathtofile_20-456_1.jpg
个
破折号在那里,但没有目录斜杠我不能移动文件。我想知道为什么破折号的解释不再工作,如果我添加\/
到正则表达式模式。
有什么建议吗?
2条答案
按热度按时间20jt8wwn1#
使用您显示的示例和尝试,请尝试以下
awk
代码。字符串
echo
打印值/path/to/file 20-456 (1).jpg
作为awk
程序的标准输入。在awk
程序中,在BEGIN
部分将FS
和OFS
设置为/
。然后在主程序中使用gsub
在最后一个字段($NF)中全局替换空格为_
,然后在最后一个字段中全局替换-
或(
或)
为NULL,然后提到1
将打印该行。vwkv1x7d2#
你可以使用string manipulation in Bash得到结果:
字符串
请参见online demo产生
/path/to/file_20-456_1.jpg
。快速注解:
${path%/*}
-从path
的末尾开始,将最小的块扩展到/
${path##*/}
-从path
开始到最后/
(包括它)的最大文本块file
中,${file// /_}
将所有空格替换为_
${file//[^[:alnum:]._-]/}
从file
中删除所有非字母数字的字符.
、_
和-
。