提取文件和输出线的特定字符串与修改另一个文件(Extract specific strings fr

2019-09-17 02:31发布

新的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

我猜这可能也涉及类似“腰斩”,但我不能让我的头缠着如何核算更改文件夹和文件名。

任何帮助将非常感激。

Answer 1:

sed 's|^|cd |; s|/\([^/]*\)$|; $RUNLD \1|' inputfile > run

它说:

  • 插入“CD”在该行的开头
  • 最后斜线后会发生什么,替代“; $ RUNLD”和最后一部分(用括号捕获)


Answer 2:

sed -e 's/^/cd /; s|/\([^/]*\)$|; \$RUNLD \1|' file

这种预先考虑“CD”,并替换最后/用“; $ RUNLD”。 瞧!



Answer 3:

只需使用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



Answer 4:

我可能会去这与基于循环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


Answer 5:

这可能会为你工作:

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
标签: bash sed awk find cut