3

在一个文件 ( file1.txt) 中,我有/path1/|value1(一个路径,后跟一个值)。我需要找到包含该(唯一)路径的行,然后更改值。因此,该行应以:/path1/|value2.

挑战在于/path1/和部分都包含在变量中value1value2

当我不使用变量时,我可以使用(感谢此页面):

sed '/path1/s/value1/value2/g' file1.txt > copyfile1.txt

(这会创建原始文件的副本,我以后可以使用 . 覆盖原始文件mv。)

这只是搜索path1。要搜索/path1/我可以使用:

sed '/\/path1\//s/value1/value2/g' file1.txt > copyfile1.txt

使用关于提取子字符串的这个问题的答案,我可以将/path1/,value1value2部分放入变量中。

所以我目前的代码是:

sed '/'"${PATH}"'/s/'"${PREVIOUS_VALUE}"'/'"${NEW_VALUE}"'/g' file1.txt > copyfile1.txt

但这不起作用,因为 PATH 变量包含正斜杠。使用此处的信息,我首先尝试进行如下替换:

FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\/\//g')

首先,然后使用FORMATTED_PATH代替,PATH但随后查找和替换不起作用(没有错误消息,新文件为空)。在日志记录中FORMATTED_PATH = //path1//(我认为是正确的)。

如何使用包含正斜杠的变量来查找和替换?

(我通过这个答案发现我需要关闭单引号,在变量周围使用双引号,然后再次打开单引号。但这对正斜杠没有帮助。)

4

3 回答 3

1

代码几乎是正确的。代替:

FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\/\//g')

我应该有:

FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\\\//g')

然后,这会产生正确的日志记录:FORMATTED_PATH = \/path1\/

于 2012-11-12T16:24:21.713 回答
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 变量使用全大写:你已经清除了PATH用于查找程序的 shell 变量。

于 2012-11-12T17:58:24.027 回答
1

通常sed's命令(如s///)支持使用除/. 例如:

$ echo '/path1/|value1' | sed 's,\(/path1/|\).*,\1value2,'
/path1/|value2
$

这在处理包含/字符的文件路径名时非常方便。

于 2012-12-11T08:41:04.657 回答