这是我遇到的一个简单问题,但我不太擅长,sed
因此任何快速帮助将不胜感激。
我使用split
.结果,所有单位数块都有一个前导零(例如BRNSPC_varID_chunk_07.txt
)。我想删除下划线后面的前导零,使其看起来像这样:BRNSPC_varID_chunk_7.txt
。我不想影响任何尾随零(即我想BRNSPC_varID_chunk_70.txt
保留BRNSPC_varID_chunk_70.txt
)。有人可以帮我快速重命名所有这些文件吗?它导致我的 R 脚本出现错误,我不知道如何在 R 中处理。
另外,其中一个文件只是BRNSPC_varID_chunk_00.txt
.我希望就这样BRNSPC_varID_chunk_0.txt
。
谢谢
答案1
给定
$ touch BRNSPC_varID_chunk_07.txt BRNSPC_varID_chunk_00.txt BRNSPC_varID_chunk_70.txt
那么至少在bash
, ksh
,zsh
$ for f in ./*chunk_0?.txt; do echo mv "$f" "${f/chunk_0/chunk_}"; done
mv ./BRNSPC_varID_chunk_00.txt ./BRNSPC_varID_chunk_0.txt
mv ./BRNSPC_varID_chunk_07.txt ./BRNSPC_varID_chunk_7.txt
echo
一旦您确信它会做正确的事情,就将其删除。
chunk
如果没有歧义(即,如果序列_0
不能出现在名称中的其他位置),则可以删除前缀。
还有许多其他不太便携的解决方案等rename
,mmv
例如使用rename
from util-linux
:
rename.ul -n -v chunk_0 chunk_ ./*chunk_0?.txt
(删除-n
以实际重命名)。
答案2
使用rename
:
rename 's/(BRNSPC_varID_chunk_)0([0-9])/$1$2/' *.txt
*.txt
将扩展到.txt
当前目录中的所有文件。
重命名将查找包含BRNSPC_varID_chunk_0[0-9]
第一个匹配组所在位置BRNSPC_varID_chunk_
和第二个匹配组是尾随的任何文件[0-9]
,它将仅用第一个和第二个匹配组替换它(消除中间的零)。
答案3
这是选择正确的正则表达式来匹配要替换的字符串的问题。
您已使用 sed 标记了该问题。
在 中sed
,使用 ERE 语法(以避免几个\
):
s#(chunk_)0+([0-9]+\.)#\1\2#
这将替换文本chunk_
(并将其捕获为第一个反向引用\1
),后跟任意数量(至少一个)的(前导)零,0+
后跟任意数量的数字(至少一个),后跟一个点\.
并转换与反向引用\1\2
(删除几个前导零)。
使用较旧但更可移植的语法,它是:
s#\(chunk_\)0\{1,\}\([0-9]\{1,\}\.\)#\1\2#
这将转换:
for file in ./BRNSPC_varID_chunk*.txt; do
filenew=$(echo "$file" | sed -E 's#(chunk_)0+([0-9]+\.)#\1\2#')
echo mv -n "$file" "$filenew"
done
使用 sed 仅在不支持正则表达式的 shell 上才有意义。
在 bash 中,你可以这样做:
regex='(.*chunk_)0+([0-9]+\..*)'
for file in ./BRNSPC_varID_chunk*.txt; do
if [[ $file =~ $regex ]]; then
filenew=$(IFS=;printf '%s' "${BASH_REMATCH[@]:1}")
echo mv -n "$file" "$filenew"
fi
done
这将打印这种类型的列表:
mv -n ./BRNSPC_varID_chunk_000000.txt ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_0000.txt ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_00011.txt ./BRNSPC_varID_chunk_11.txt
mv -n ./BRNSPC_varID_chunk_000.txt ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_00.txt ./BRNSPC_varID_chunk_0.txt
mv -n ./BRNSPC_varID_chunk_010.txt ./BRNSPC_varID_chunk_10.txt
mv -n ./BRNSPC_varID_chunk_011.txt ./BRNSPC_varID_chunk_11.txt
mv -n ./BRNSPC_varID_chunk_012.txt ./BRNSPC_varID_chunk_12.txt
mv -n ./BRNSPC_varID_chunk_013.txt ./BRNSPC_varID_chunk_13.txt
mv -n ./BRNSPC_varID_chunk_014.txt ./BRNSPC_varID_chunk_14.txt
mv -n ./BRNSPC_varID_chunk_015.txt ./BRNSPC_varID_chunk_15.txt
mv -n ./BRNSPC_varID_chunk_01.txt ./BRNSPC_varID_chunk_1.txt
mv -n ./BRNSPC_varID_chunk_02.txt ./BRNSPC_varID_chunk_2.txt
mv -n ./BRNSPC_varID_chunk_03.txt ./BRNSPC_varID_chunk_3.txt
mv -n ./BRNSPC_varID_chunk_04.txt ./BRNSPC_varID_chunk_4.txt
mv -n ./BRNSPC_varID_chunk_05.txt ./BRNSPC_varID_chunk_5.txt
mv -n ./BRNSPC_varID_chunk_06.txt ./BRNSPC_varID_chunk_6.txt
mv -n ./BRNSPC_varID_chunk_07.txt ./BRNSPC_varID_chunk_7.txt
mv -n ./BRNSPC_varID_chunk_08.txt ./BRNSPC_varID_chunk_8.txt
mv -n ./BRNSPC_varID_chunk_09.txt ./BRNSPC_varID_chunk_9.txt
mv -n ./BRNSPC_varID_chunk_0.txt ./BRNSPC_varID_chunk_0.txt
请注意,它正确处理一些零。