Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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
Ruby 如何替换不带';是否不包含另一个带“sed”的字符串?_Ruby_Sed_Delimiter Separated Values - Fatal编程技术网

Ruby 如何替换不带';是否不包含另一个带“sed”的字符串?

Ruby 如何替换不带';是否不包含另一个带“sed”的字符串?,ruby,sed,delimiter-separated-values,Ruby,Sed,Delimiter Separated Values,我正在尝试替换目录中的路径 到目前为止,我已尝试在目录中的每个文件上使用此选项,但是,我发现一个语法错误: sed -i \"/'#{CREW_PREFIX}'/\\\!s,/usr,#{CREW_PREFIX},g\" \${file}; sed: -e expression #1, char 3: unknown command: `u' 以下是语法错误: sed -i \"/'#{CREW_PREFIX}'/\\\!s,/usr,#{CREW_PREFIX},g\" \${file};

我正在尝试替换目录中的路径

到目前为止,我已尝试在目录中的每个文件上使用此选项,但是,我发现一个语法错误:

sed -i \"/'#{CREW_PREFIX}'/\\\!s,/usr,#{CREW_PREFIX},g\" \${file};
sed: -e expression #1, char 3: unknown command: `u'
以下是语法错误:

sed -i \"/'#{CREW_PREFIX}'/\\\!s,/usr,#{CREW_PREFIX},g\" \${file};
sed: -e expression #1, char 3: unknown command: `u'
输入示例:

prop.ppd_search_path = '/usr/share;/usr/local/share;/usr/lib;/usr/local/lib;/usr/libexec;/opt;/usr/lib64'
示例输出:

prop.ppd_search_path = '/usr/local/share;/usr/local/share;/usr/local/lib;/usr/local/lib;/usr/local/libexec;/opt;/usr/local/lib64'
我做错了什么

该行需要匹配
/usr
,但不需要匹配
/usr/local
,否则输出的路径类似于
/usr/local/local
。 除此之外,还需要从Ruby变量读取替换项, 所以它可以是
/usr/local
(默认情况下),也可以是完全不同的 路径类似于
/foo/bar

用例:

目录(HP Linux打印系统源代码)中有数千个硬编码路径指向只读路径(
/usr
,在Chrome操作系统中)。我试图用用户定义的前缀替换
/usr
的所有实例(默认情况下,
/usr/local
),同时忽略包含用户定义前缀的行。用户定义的前缀在Ruby脚本中,必须包含在Ruby变量(
{CREW\u prefix}
)中。这就是我想做的:

  def self.patch
    # Fix hardcoded file directories
    system "for file in \$(find . -type f); do
              sed -i 's,/etc,#{CREW_PREFIX}&,g' \${file};
              sed -i 's,/usr/share,#{CREW_PREFIX}/share,g' \${file};
              sed -i 's,/usr/include,#{CREW_PREFIX}/include,g' \${file};
              sed -i 's,/usr/lib,#{CREW_LIB_PREFIX},g' \${file};
              sed -i 's,/var,#{CREW_PREFIX}&,g' \${file};
              sed -i 's,/usr/bin,#{CREW_PREFIX}/bin,g' \${file};
              sed -i 's,#{CREW_PREFIX}/bin/env,/usr/bin/env,g' \${file};
              sed -i 's,#{CREW_PREFIX}/etc/os-release,/etc/os-release,g' \${file};
              sed -i \"/'#{CREW_PREFIX}'/\\\!s,/usr,#{CREW_PREFIX},g\" \${file};
            done"
  end
但是,路径包含斜杠,这使得
sed
发出未知命令错误:

sed: -e expression #1, char 3: unknown command: `u'
我找不到另一个包含
/
功能的分隔符

这就是我要处理的:

chronos@localhost ~/Downloads/tarballs/hplip-3.19.1 $ grep -R /usr ./*/ > file; du -sh file
40K     file

如果出现
/usr
实例的行与
{CREW\u PREFIX}
的值不匹配,我需要所有这些
/usr
实例成为
{CREW\u PREFIX}
的值(变量)。我最初尝试使用
sed
,但是它不需要包含
/usr/local
。例如,请参阅更新的问题。调整上述内容以使用变量是很简单的,但很抱歉,我不明白
不包括/usr/local
意味着什么。请编辑您的问题,以澄清您试图做什么。对不起。行需要匹配
/usr
,但不需要匹配
/usr/local
,否则路径类似于
/usr/local/local
。除此之外,需要从变量中读取替换项,因此它可以是
/usr/local
(默认情况下),或者是一些完全不同的路径,如
/foo/bar
。好的,这是有意义的。你应该把这句话加到你的问题中,并确保在你的问题中包括你不想更改的行,而不仅仅是你想更改的那一行。我刚刚更新了我的答案。这真的很接近工作,除了它是一个目录,我正在处理数千个文件,这些文件包含换行符。我将发布一个对我有用的答案。
$ cat file
./configure --prefix=/usr --enable-foo --disable-bar
./configure --prefix=/usr/local --enable-foo --disable-bar

$ var='/foo/bar'; sed 's:/usr/local:\n:g; s:/usr:'"$var"':; s:\n:/usr/local:g' file
./configure --prefix=/foo/bar --enable-foo --disable-bar
./configure --prefix=/usr/local --enable-foo --disable-bar