在文件(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我需要关闭单引号,在变量周围使用双引号,然后再次打开单引号。但这对正斜杠没有帮助。)
答案 0 :(得分:1)
代码非常接近。而不是:
FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\/\//g')
我应该有:
FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\\\//g')
然后生成正确的日志记录:FORMATTED_PATH = \/path1\/
答案 1 :(得分:1)
awk也会起作用:
awk -F '|' -v path="$paht" -v new="$new_value" '{
if ($1 == path) {print path FS new}
else {print}
}' file1.txt > copyfile1.txt
另外,不要对shell变量使用全大写:你已经清除了用于查找程序的shell的PATH
变量..
答案 2 :(得分:1)
通常sed
的{{1}}命令(如s
中所述)支持使用s///
以外的分隔符。例如:
/
在处理包含$ echo '/path1/|value1' | sed 's,\(/path1/|\).*,\1value2,'
/path1/|value2
$
字符的文件路径名时非常方便。