linux Terminal SED regex失败,并带有破折号和斜线

p8ekf7hl  于 11个月前  发布在  Linux
关注(0)|答案(2)|浏览(134)

我尝试转换文件名并删除特殊字符和空格。由于某些原因,如果我声明破折号和斜杠不被替换,我的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
破折号在那里,但没有目录斜杠我不能移动文件。我想知道为什么破折号的解释不再工作,如果我添加\/到正则表达式模式。
有什么建议吗?

20jt8wwn

20jt8wwn1#

使用您显示的示例和尝试,请尝试以下awk代码。

echo "/path/to/file 20-456 (1).jpg" | 
awk 'BEGIN{FS=OFS="/"} {gsub(/ /,"_",$NF);gsub(/-|\(|\)/,"",$NF)} 1'

字符串

  • 解释:* 简单的解释是,通过echo打印值/path/to/file 20-456 (1).jpg作为awk程序的标准输入。在awk程序中,在BEGIN部分将FSOFS设置为/。然后在主程序中使用gsub在最后一个字段($NF)中全局替换空格为_,然后在最后一个字段中全局替换-()为NULL,然后提到1将打印该行。
vwkv1x7d

vwkv1x7d2#

你可以使用string manipulation in Bash得到结果:

#!/bin/bash
path="/path/to/file 20-456 (1).jpg"
fldr="${path%/*}"   # Get the folder
file="${path##*/}"  # Get the file name
file="${file// /_}" # Replace spaces with underscores in filename
echo "$fldr/${file//[^[:alnum:]._-]/}" # Get the result

字符串
请参见online demo产生/path/to/file_20-456_1.jpg
快速注解:

  • ${path%/*}-从path的末尾开始,将最小的块扩展到/
  • ${path##*/}-从path开始到最后/(包括它)的最大文本块
  • file中,${file// /_}将所有空格替换为_
  • ${file//[^[:alnum:]._-]/}file中删除所有非字母数字的字符._-

相关问题