我有 n 个文件,名为 f1 , f2 ,..., fn 。对于每个文件,我必须执行sed命令,并将新文件命名为 file1 , file2 ,..., filen
我需要新文件保持与原始文件相同的数字。有人可以帮忙吗?
这是我到目前为止所尝试的内容:
#!/bin/sh
for element in *
do
echo "$element" sed -n '/Col3/p' $element > Quest $element
done
答案 0 :(得分:1)
如果我们假设您的所有文件都在您的问题中?
$ ls -l
total 2
-rw-r--r-- 1 ghoti wheel 0 Jan 3 13:20 f1
-rw-r--r-- 1 ghoti wheel 0 Jan 3 13:20 f2
-rw-r--r-- 1 ghoti wheel 0 Jan 3 13:20 f3
-rw-r--r-- 1 ghoti wheel 0 Jan 3 13:20 f4
然后你在for
循环的正确轨道上。但您可能希望将搜索范围缩小到仅对您重要的文件。
在bash中,您可以使用extglob
来控制此类事情。例如:
#!/usr/bin/env bash
shopt -s extglob
for file in +([a-z])+([0-9]); do
echo "Old: $file / New: file${file##[a-z]}"
done
这匹配任何名称由字母后跟数字组成的文件。
另一方面,如果你想让它变得可移植,那么它将在POSIX shell中工作(因为在你的问题中你已经指定了/bin/sh
),你可能会将检测放入循环中本身:
#!/bin/sh
for file in *; do
if ! expr "$file" : '[a-z][a-z]*[0-9][0-9]*$' >/dev/null; then
continue
fi
echo "Old: $file / New: file${file##[a-z]}"
done
在这两个例子中,我们使用POSIX“参数扩展”去除文件名开头的字母。
答案 1 :(得分:0)
#!/bin/env bash
for FILE in *
do
[[ "$FILE" =~ [0-9]+$ ]] && mv "$FILE" file${BASH_REMATCH[0]}
done
[[ ]]
中的表达式是一个测试,它测试与正则表达式的匹配,该正则表达式查找以数字结尾的字符串。如果匹配成功,则可以在索引bash
的{{1}}数组变量BASH_REMATCH
中找到匹配的数字。如果测试成功,则执行0
之后的部分,并将文件重命名为&&
,