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

问题描述 投票:0回答:1

我在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

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

r bash sed
1个回答
0
投票

循环遍历find的输出。

while IFS= read -ru "$fd" -d '' files; do
  echo "$files"  ##: do whatever you want to do with the files here.
done {fd}< <(find . -name 'xray_data' -print0)
  • 引号中没有嵌入的命令。

  • 它使用一个随机的fd,以防循环内的某些东西吞噬/吸食stdin

  • -print0null字节分隔文件,因此它应该足够安全以处理路径和文件名上的空格和换行符。

  • [一个好的开始总是总是在要处理文件的每个命令前面都加一个echo,这样您就知道什么情况下将要执行/发生……

    ]
© www.soinside.com 2019 - 2024. All rights reserved.