Que*_*ark 23 regex linux bash shell parsing
我正在编写一个需要解析文件名的bash脚本.
它将需要删除所有特殊字符(包括空格):"!?. - _并将所有大写字母更改为小写.这样的东西:
Some_randoM data1-A
More Data0
Run Code Online (Sandbox Code Playgroud)
至:
somerandomdata1a
moredata0
Run Code Online (Sandbox Code Playgroud)
我在许多不同的编程语言中看到了很多问题,但在bash中没有.有没有办法做到这一点?
Dan*_*iss 36
cat yourfile.txt | tr -dc '[:alnum:]\n\r' | tr '[:upper:]' '[:lower:]'
Run Code Online (Sandbox Code Playgroud)
第一个tr删除特殊字符.d表示删除,c表示补码(反转字符集).因此,-dc意味着删除除指定字符之外的所有字符 在\n与\r包括保持Linux或Windows风格的换行符,我假设你想要的.
第二个将大写字符转换为小写.
gni*_*urf 13
纯粹的bash解决方案:
$ filename='Some_randoM data1-A'
$ f=${filename//[^[:alnum:]]/}
$ echo "$f"
SomerandoMdata1A
$ echo "${f,,}"
somerandomdata1a
Run Code Online (Sandbox Code Playgroud)
这个功能:
clean() {
local a=${1//[^[:alnum:]]/}
echo "${a,,}"
}
Run Code Online (Sandbox Code Playgroud)
试试吧:
$ clean "More Data0"
moredata0
Run Code Online (Sandbox Code Playgroud)
如果您使用的是mkelement0和Dan Bliss方法。您还可以查看sed + POSIX正则表达式。
cat yourfile.txt | sed 's/[^a-zA-Z0-9]//g'
Run Code Online (Sandbox Code Playgroud)
Sed匹配括号内除字母和数字之外的所有其他字符,并将其删除。
我曾经tr删除不属于[:print:]班级的任何字符
cat file.txt | tr -dc '[:print:]'
Run Code Online (Sandbox Code Playgroud)
要么
echo "..." | tr -dc '[:print:]'
Run Code Online (Sandbox Code Playgroud)
另外,您可能想要|(输出)输出od -c以确认结果
cat file.txt | tr -dc '[:print:]' | od -c
Run Code Online (Sandbox Code Playgroud)