新的Linux,并试图逃离这个做硬盘的方式。 我有一个包含“查找”命令的结果的文件(“output.txt的”)。 实施例首先从“output.txt的”三行:
/home/user/temp/LT50150292009260GNC01/L5015029_02920090917_MTL.txt
/home/user/temp/LT50150292009276GNC01/L5015029_02920091003_MTL.txt
/home/user/temp/LT50150292009292GNC01/L5015029_02920091019_MTL.txt
我想用awk或sed的(或类似)从每行列出的路径,并输出到一个新文件(“run.txt”),每行添加像这样的额外信息提取两个部分:
cd /home/user/temp/LT50150292009260GNC01; $RUNLD L5015029_02920090917_MTL.txt
cd /home/user/temp/LT50150292009276GNC01; $RUNLD L5015029_02920091003_MTL.txt
cd /home/user/temp/LT50150292009292GNC01; $RUNLD L5015029_02920091019_MTL.txt
我猜这可能也涉及类似“腰斩”,但我不能让我的头缠着如何核算更改文件夹和文件名。
任何帮助将非常感激。
sed 's|^|cd |; s|/\([^/]*\)$|; $RUNLD \1|' inputfile > run
它说:
- 插入“CD”在该行的开头
- 最后斜线后会发生什么,替代“; $ RUNLD”和最后一部分(用括号捕获)
sed -e 's/^/cd /; s|/\([^/]*\)$|; \$RUNLD \1|' file
这种预先考虑“CD”,并替换最后/用“; $ RUNLD”。 瞧!
只需使用bash
while IFS= read -r filename; do
printf 'cd %s; $RUNLD %s\n' "${filename%/*}" "${filename##*/}"
done < output.txt > run
见http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
我可能会去这与基于循环grep的解决方案,因为我不知道cut
,或awk
非常好,哈哈。 这确实的伎俩:
while read x; do folder=$(echo "$x" | grep -o '^.*/'); file=$(echo "$x" | grep -o '[^/]*$'); echo "cd ${folder:0:-1}; \$RUNLD $file"; done < output.txt > run
这可能会为你工作:
sed 's/\(.*\)\//cd \1; $RUNLD /' file
cd /home/user/temp/LT50150292009260GNC01; $RUNLD L5015029_02920090917_MTL.txt
cd /home/user/temp/LT50150292009276GNC01; $RUNLD L5015029_02920091003_MTL.txt
cd /home/user/temp/LT50150292009292GNC01; $RUNLD L5015029_02920091019_MTL.txt
文章来源: Extract specific strings from line in file and output to another file with modifications