我在一个目录中有一组文件位置,我想从每个文件读取第二行,提取放在大括号“()”之间的第一个子字符串,并用这个子字节重命名该文件。
我不是在寻找完整的bash代码,我只需要为每一步使用一些提示和命令
实施例: 文件包含以下行:
/* USER: 202166 (just_yousef) */
/* PROBLEM: 2954 (11854 - Egypt) */
/* SUBMISSION: 11071978 */
/* SUBMISSION TIME: 2012-12-25 15:49:25 */
/* LANGUAGE: 3 */
我需要使用子串“11854 - 埃及”并用它重命名该文件,然后继续下一个文件。
答案 0 :(得分:0)
使用目录管道中的每个管道与xargs相同并过滤您要读取的文件。并将带有路径的文件名传递给脚本,该脚本将读取第二行。
对于脚本打开文件并根据逻辑提取String a。
关闭文件并使用rename命令将文件名作为此脚本的输入。
重命名$ 0 .txt
如果文件结构是recurrrsive,则在最后一个/使用string方法的索引之前提取名称。
答案 1 :(得分:0)
看起来sed
可能是工作的工具:
for i in *
do
j=`sed -e '1d;2{;s/.*(\(.*\)).*/\1/;q;}' "$i"`
test -z "$j" || test -e "$j" || mv -v "$i$ "$j"
done
我将$j
的测试视为空或已存在作为安全措施;你可能会想到别人。我还将-v
标记给mv
,以便您可以看到它正在做什么。
您可能更喜欢使用sed -n
,只需对匹配PROBLEM:
的行进行操作,如果这比使用第二行更可靠。
答案 2 :(得分:0)
来自每个文件
for f in /the/directory/*; do
# ...
done
读取第二行[和]提取放在[括号]
之间的第一个子串
v=$(sed -n '2 { s/[^(]*(\([^)]*\)).*/\1/; p; q }' < "${f}")
重命名该文件
使用mv
命令。