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