Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sed将字符串动态传递给Rscript参数_R_Bash_Sed - Fatal编程技术网

使用sed将字符串动态传递给Rscript参数

使用sed将字符串动态传递给Rscript参数,r,bash,sed,R,Bash,Sed,我用R写了一个脚本,它有几个参数。我想迭代20个目录,并在每个目录上执行脚本,同时使用sed从文件路径中传入一个子字符串作为my-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 "{}/..

我用R写了一个脚本,它有几个参数。我想迭代20个目录,并在每个目录上执行脚本,同时使用sed从文件路径中传入一个子字符串作为my-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: RE error: illegal byte sequence
当我在示例文件路径上尝试将sed与我的模式一起使用时,它会起作用:

echo "./DeMMO1/D1T1exp_Dec2019_Poorman/xray_data" | sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/'
这将生成正确的子字符串:

D1T1exp_Dec2019
我认为在解释的字符串中使用单引号是有问题的,但我不知道如何处理这个问题。我尝试过用双引号替换sed模式周围的单引号,以及删除单引号,这两种方法都会导致此错误:

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: RE error: illegal byte sequence

在这种情况下,如何从文件路径中动态提取子字符串?

以循环查找的输出

而IFS=read-ru“$fd”-d”文件;做
echo“$files”##:对此处的文件执行任何操作。

完成{fd}<由于sed中的引号问题,这是最终对我有效的解决方案:

for dir in `find . -name 'xray_data'`; 
do sampleID="`basename $(dirname $dir) | cut -f1 -d'_'`";
Rscript /Users/Caitlin/Desktop/DeMMO_Pubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R -f "$dir" -b "$dir/SEM_images" -c "$dir/../coordinates.txt" -z ".tif" -m ".tif" -a "Unknown|SEM|Os" -d "overview" -y "overview" --overview "overview.*tif" -p FALSE -n "$sampleID"; 
done

如果使用-exec和find嵌入一个命令,这几乎太复杂了,因为,是的,这将是一个引用地狱;-)一个更好的选择是通过解析
find
的输出来循环文件,只要我的两分钱。谢谢你的反馈@Jetchisel!我会尝试找出一个for循环的解决方案谢谢你的帮助,但是我仍然会遇到sed的麻烦!我试过这样做:当IFS=read-r文件时;do Rscript/Users/Caitlin/Desktop/DeMMO_Pubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R-f“$files”-b“$files/SEM_images”-c“$files/。/coordinates.txt”-z.tif”-m.tif”-a“未知的”SEM Os”-Os”-d“概述”-y“概述”-overview“概述”.*tif”-p假-n“sed-s-s/*s/*s/*DeMMO.[/][1数据文件”已完成<我还尝试运行上面的行,但使用了:-n“
sed-e的/*DeMMO.*[/]\(.*\)\u.*[/]xray\u data/\1/”“$files”
,这会导致错误“非法字节序列”,如果我包含print0,我看不到调试脚本所需的任何控制台输出。不确定我做错了什么:Caitlins-MacBook-Pro-2:data Caitlin$,而IFS=read-ru“$fd”-d”文件;do>Rscript/Users/Caitlin/Desktop/DeMMO_Pubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R-f“$files”-b“$files/SEM_images”-c“$files/。/coordinates.txt”-z.tif”-m.tif”-a“未知”;“SEM Os”-d“概述”-y”-概述”-“概述”-“概述”-“概述”..tif”-p假-n”
sed-s/.[\/]“
”>done{fd}<对,如果您的bash不够新,这将是一个问题。删除
“$fd”
{fd}
并确保您使用的是
bash
而不是
sh