Kry*_*nyx 4 command-line text-processing
如何修改文本文件以通过 1 个命令执行以下操作?
我有一个名为Errors.txt以下 3 行的文本文件:
Error in File /Test1/A.png
Error in File /Test2/B.jpg
Error in File /Test3/C.jpg
Run Code Online (Sandbox Code Playgroud)
我想要一个命令来执行以下操作:
"/mnt/HD."在每行末尾。webp"。mv在每行的开头。我希望结果是这样的:
mv "/mnt/HD/Test1/A.png" "/mnt/HD/Test1/A.webp"
mv "/mnt/HD/Test2/B.jpg" "/mnt/HD/Test2/B.webp"
mv "/mnt/HD/Test3/C.jpg" "/mnt/HD/Test3/C.webp"
Run Code Online (Sandbox Code Playgroud)
从表面上回答您的问题:
1- 找到每个 {Error in File } 并将其替换为 {"/mnt}
sed 's/Error in File /"\/mnt/' Errors.txt
Run Code Online (Sandbox Code Playgroud)
虽然你实际上似乎想要
sed 's/Error in File /"\/mnt\/HD/' Errors.txt
Run Code Online (Sandbox Code Playgroud)
2-在每行末尾添加 {"}
sed 's/$/"/' Errors.txt
Run Code Online (Sandbox Code Playgroud)
3-复制每一行,添加一个空格并粘贴该行
sed 's/.*/& &/' Errors.txt
Run Code Online (Sandbox Code Playgroud)
4-用 {webp"} 替换每行的最后 4 个字符
sed 's/....$/webp"/' Errors.txt
Run Code Online (Sandbox Code Playgroud)
5-在每行的开头添加 {mv }
sed 's/^/mv /' Errors.txt
Run Code Online (Sandbox Code Playgroud)
所以(天真地)你可以把它们放在一起作为
sed -e 's/Error in File /"\/mnt\/HD/' -e 's/$/"/' -e 's/.*/& &/' -e 's/....$/webp"/' -e 's/^/mv /' Errors.txt
Run Code Online (Sandbox Code Playgroud)
一种不太零碎的方法是使用捕获组,如下所示
sed -E 's;Error in File (.*)(.{4})$;mv "/mnt/HD\1\2" "/mnt/HD\1.webp";' Errors.txt
Run Code Online (Sandbox Code Playgroud)
用作sed 分隔符允许您在模式和/或替换文本中;包含未转义的字符。/
但是,如果您的目标是创建一组mv命令并将它们传递给 shell 来执行它们,我建议更像
sed -n 's;^Error in File ;/mnt/HD;p' Errors.txt |
while IFS= read -r f; do echo mv -n -- "${f}" "${f%.*}.webp"; done
Run Code Online (Sandbox Code Playgroud)
此处该sed命令将前导字符串替换Error in file 为/mnt/HD并将结果行打印到标准输出流。然后while循环读取整行(可能包括空格或其他 shell 特殊字符)并确保它们在传递给命令时被正确引用mv。
shell 替换${f%.*}从文件中删除最短的点后缀 - 比仅仅盲目删除最后 4 个字符更通用。
当您准备好真正echo执行命令时,请删除。mv