使用变量在ksh中查找并替换包含正斜杠的字符串

时间:2012-11-12 13:04:11

标签: string variables replace ksh

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

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

当我不使用变量时,我可以使用(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/value1value2部分放入变量中。

所以我目前的代码是:

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我需要关闭单引号,在变量周围使用双引号,然后再次打开单引号。但这对正斜杠没有帮助。)

3 个答案:

答案 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 $ 字符的文件路径名时非常方便。