r - 使用 sed 将字符串动态传递给 Rscript 参数
问题描述
我在 R 中编写了一个包含多个参数的脚本。我想迭代 20 多个目录并在每个目录上执行我的脚本,同时使用 sed 从文件路径作为我的 -n 参数传入一个子字符串。我运行了以下内容:
find . -name 'xray_data' -exec sh -c 'Rscript /Users/Caitlin/Desktop/DeMMO_Pubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R -f {} -b "{}/SEM_images" -c "{}/../coordinates.txt" -z ".tif" -m ".tif" -a "Unknown|SEM|Os" -d "overview" -y "overview" --overview "overview.*tif" -p FALSE -n "`sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/' "{}"`"' sh {} \;
导致此错误:
ubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R -f {} -b "{}/SEM_images" -c "{}/../coordinates.txt" -z ".tif" -m ".tif" -a "Unknown|SEM|Os" -d "overview" -y "overview" --overview "overview.*tif" -p FALSE -n "`sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/' "{}"`"' sh {} \;
sh: command substitution: line 0: syntax error near unexpected token `('
sh: command substitution: line 0: `sed -e s/.*DeMMO.*[/](.*)_.*[/]xray_data/1/ "./DeMMO1/D1T3rep_Dec2019_Ellison/xray_data"'
当我尝试在示例文件路径上将 sed 与我的模式一起使用时,它可以工作:
echo "./DeMMO1/D1T1exp_Dec2019_Poorman/xray_data" | sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/'
这会产生正确的子字符串:
D1T1exp_Dec2019
我认为尝试在解释的字符串中使用单引号存在问题,但我不知道如何处理。我尝试用双引号替换 sed 模式周围的单引号以及删除单引号,两者都会导致此错误:
sed: RE error: illegal byte sequence
在这种情况下,我应该如何从文件路径中动态提取子字符串?
解决方案
循环查找的输出。
while IFS= read -ru "$fd" -d '' files; do
echo "$files" ##: do whatever you want to do with the files here.
done {fd}< <(find . -type f -name 'xray_data' -print0)
引号中没有嵌入的命令。
它使用随机
fd
的,以防循环内的某些东西正在吃/啜stdin
还
-print0
用字节分隔文件null
,因此它应该足够安全以处理路径和文件名上的空格制表符和换行符。一个好的开始总是
echo
在您想要对文件执行的每个命令之前放置一个,这样您就知道将要执行/发生什么以防万一......
推荐阅读
- reactjs - 如何修复 React JS 中的“XML 解析错误:语法错误”?
- c# - 为什么用鼠标旋转物体时它会旋转到相反的方向?
- python - 如何在csv中创建一个带有for循环多年的数据框
- d3.js - D3 Force Layout 是该图的最佳选择吗?
- jquery - 使用 jQuery .on() 方法不会在动态创建的元素上绑定事件
- python - 如果使用了太多的蜘蛛,Scrapy 抓取失败(抓取 0 页)
- ios - 如何从外部更新 SwiftUI 视图状态(例如 UIViewController)
- ios - 哪里可以找到没有 xcode 的 iOS Bundle ID?(扑)
- jquery - 如何使用 jQuery localStorage 记住上次打开的选项卡?
- javascript - 淡入新元素的可靠方法