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

SED使用变量查找字符串,编辑,然后替换,sed,Sed,我在尝试使用SED编辑文件时遇到了一些问题,使用的变量中有正向斜杠 我试图编辑的文件“校验和”包含以下内容 758f9775093bf885dbc963cba1aec732,/bin/bash 1b45027142521f2a1c3d95891770eb47,/etc/grub.conf 2a34dc288f7994cc7b1b338605ef8775,/etc/hosts 03f670845fe199955f9a0babecbda9a0,/etc/networks 我想使用变量(file_p

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

我试图编辑的文件“校验和”包含以下内容

758f9775093bf885dbc963cba1aec732,/bin/bash
1b45027142521f2a1c3d95891770eb47,/etc/grub.conf
2a34dc288f7994cc7b1b338605ef8775,/etc/hosts
03f670845fe199955f9a0babecbda9a0,/etc/networks
我想使用变量(file_path=“/bin/bash”)搜索字符串“/bin/bash”,找到该字符串后,删除“,”之前的所有内容,并替换为工作“VALID”

下面是我的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

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

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

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

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

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

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

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

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

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

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

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

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

以完成@ooga的正确答案。保留单引号可以避免bash可以解释的特殊字符可能出现的歧义。要做到这一点,您只需用一个引号关闭sed块,然后重新打开它:

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

完成@ooga的好答案。保留单引号可以避免bash可以解释的特殊字符可能出现的歧义。要做到这一点,您只需用一个引号关闭sed块,然后重新打开它:

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

完成@ooga的好答案。保留单引号可以避免bash可以解释的特殊字符可能出现的歧义。要做到这一点,您只需用一个引号关闭sed块,然后重新打开它:

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

完成@ooga的好答案。保留单引号可以避免bash可以解释的特殊字符可能出现的歧义。要做到这一点,您只需用一个引号关闭sed块,然后重新打开它:

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

只需使用awk即可享受简单的生活:

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

无论
文件路径
的内容是什么,包括
/
或RE元字符或shell globbing字符,这都会起作用,如果其内容部分匹配文件中行的任何部分,则不会产生错误匹配。

只需使用awk即可:

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

无论
文件路径
的内容是什么,包括
/
或RE元字符或shell globbing字符,这都会起作用,如果其内容部分匹配文件中行的任何部分,则不会产生错误匹配。

只需使用awk即可:

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

无论
文件路径
的内容是什么,包括
/
或RE元字符或shell globbing字符,这都会起作用,如果其内容部分匹配文件中行的任何部分,则不会产生错误匹配。

只需使用awk即可:

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


无论
文件路径的内容是什么
,,包括
/
或重元字符或shell globbing字符,如果其内容部分匹配文件行的任何部分,则不会产生错误匹配。

对于oogas,答案
$file\u path
在双引号内,但对于您的答案,它不在任何引号内。这怎么会更好呢?这不是更好或更糟,这是用单引号实现的方法。主要的兴趣是你可以在单引号之间写任何你想写的东西,而不需要bash解释它。@casimirithippolyte我不同意这里的观点。不引用变量而避免bash来解释不存在的插值元素实际上更糟糕<代码>:P@casimirithippolyte您的变量不是在单引号之间,而是在任何引号之外。如果希望脚本的其余部分使用单引号而不是双引号,那么可以将其编写为
sed'\~'“$file\u path”~s~^[^,]*~VALID~'校验和
,但我看不到该脚本增加复杂性的好处。+1@CasimiretHippolyte,我必须将sed命令放在bash脚本中,并使用您的语法正确解释变量。我很高兴你提出了你对这个问题的看法。对于oogas,答案
$file\u path
包含在双引号内,但是对于你的答案,它不包含在任何引号内。这怎么会更好呢?这不是更好或更糟,这是用单引号实现的方法。主要的兴趣是你可以在单引号之间写任何你想写的东西,而不需要bash解释它。@casimirithippolyte我不同意这里的观点。不引用变量而避免bash来解释不存在的插值元素实际上更糟糕<代码>:P@casimirithippolyte您的变量不是在单引号之间,而是在任何引号之外。如果希望脚本的其余部分使用单引号而不是双引号,那么可以将其编写为
sed'\~'“$file\u path”~s~^[^,]*~VALID~'校验和
,但我看不到该脚本增加复杂性的好处。+1@CasimiretHippolyte,我必须将sed命令放在bash脚本中,并使用您的语法正确解释变量。我很高兴你提出了你对这个问题的看法。对于oogas,答案
$file\u path
包含在双引号内,但是对于你的答案,它不包含在任何引号内。这怎么会更好呢?这不是更好或更糟,这是用单引号实现的方法。主要的兴趣是你