在文件(file1.txt
)中,我有/path1/|value1
(一个路径,后跟一个值)。我需要找到包含该(唯一)路径的行,然后更改该值。因此该行最终应为:/path1/|value2
。
挑战在于 /path1/
、value1
和 value2
部分都包含在变量内。
当我不使用变量时,我可以使用 ( thanks to this page ):
sed '/path1/s/value1/value2/g' file1.txt > copyfile1.txt
(这会创建原始文件的副本,稍后我可以使用 mv
覆盖原始文件。)
这只是搜索path1
。要搜索 /path1/
我可以使用:
sed '/\/path1\//s/value1/value2/g' file1.txt > copyfile1.txt
使用the answers to this question about extracting a substring我可以将 /path1/
、value1
和 value2
部分放入变量中。
所以我当前的代码是:
sed '/'"${PATH}"'/s/'"${PREVIOUS_VALUE}"'/'"${NEW_VALUE}"'/g' file1.txt > copyfile1.txt
但这不起作用,因为 PATH 变量包含正斜杠。使用信息from here我首先尝试过进行这样的替换:
FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\/\//g')
首先,然后使用 FORMATTED_PATH
而不是 PATH
但查找和替换不起作用(没有错误消息,新文件为空)。在日志记录中 FORMATTED_PATH =//path1//
(我认为是正确的)。
如何使用包含正斜杠的变量进行查找和替换?
(我发现 via this answer 我需要关闭单引号,在变量周围使用双引号,然后再次打开单引号。但这对正斜杠没有帮助。)
最佳答案
代码几乎是正确的。而不是:
FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\/\//g')
我应该有:
FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\\\//g')
这会产生正确的日志记录:FORMATTED_PATH =\/path1\/
关于string - 使用变量查找并替换 ksh 中包含正斜杠的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344232/