我在尝试使用带有正斜杠的变量编辑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
答案 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字符,它都会有效,如果它的内容不会产生错误匹配部分匹配文件中任何一行的部分。