SED使用变量,编辑,然后替换查找字符串

时间:2014-09-04 00:41:03

标签: sed

我在尝试使用带有正斜杠的变量编辑SED文件时遇到了一些问题。

我正在尝试编辑“校验和”的文件包含以下内容......

758f9775093bf885dbc963cba1aec732,/bin/bash
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts
03f670845fe199955f9a0babecbda9a0,/etc/networks

我想使用变量(file_path =“/ bin / bash”)搜索字符串“/ bin / bash”,当我找到该字符串时,将所有内容删除到“,”并替换为“有效”。

下面是我的sed语法和尝试,但是当我尝试使用变量时失败了。有什么建议吗?

没有变量的成功

# sed '\/bin\/bash/ s/^.*,/VALID,/g' checksum
VALID,/bin/bash
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts
03f670845fe199955f9a0babecbda9a0,/etc/networks

变量失败

# file_path="/bin/bash"
# echo $file_path
/bin/bash

# sed '/$file_path/ s/^.*,/VALID,/g' checksum
758f9775093bf885dbc963cba1aec732,/bin/bash
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts
03f670845fe199955f9a0babecbda9a0,/etc/networks

我已经尝试用变量{}包装变量,但仍然有相同的失败:

# sed '/"$file_path"/ s/^.*,/VALID,/g' checksum
758f9775093bf885dbc963cba1aec732,/bin/bash
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts
03f670845fe199955f9a0babecbda9a0,/etc/networks

# sed '/{$file_path}/ s/^.*,/VALID,/g' checksum
758f9775093bf885dbc963cba1aec732,/bin/bash
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts
03f670845fe199955f9a0babecbda9a0,/etc/networks

我还使用“|”作为转义字符。

# sed '|{$file_path}| s|^.*,|VALID,|g' checksum
sed: -e expression #1, char 1: unknown command: `|'

有关如何完成此任务的任何建议?

# sed --version
GNU sed version 4.2.1

3 个答案:

答案 0 :(得分:1)

单引号禁止变量替换。试试这个:

sed "\:$file_path: s/^.*,/VALID,/" checksum

请注意,我已将模式分隔符更改为冒号,以便变量值中的斜杠不会结束模式。

答案 1 :(得分:1)

完成@ ooga的好答案。保留单引号可以很有趣,以避免bash可以解释的特殊字符可能出现的歧义。为此,您只需使用单引号关闭sed块即可在以后重新打开它:

sed '\~'$file_path'~s~^[^,]*~VALID~' checksum

答案 2 :(得分:1)

只需使用awk过简单的生活:

awk -v fp="$file_path" 'BEGIN{FS=OFS=","} $2==fp{$1="Valid"} 1' file

无论file_path的内容是什么,包括/或RE元字符或shell globbing字符,它都会有效,如果它的内容不会产生错误匹配部分匹配文件中任何一行的部分。