Bash 如何用sed查找和替换没有在特定字符之前或之后的项目?

Bash 如何用sed查找和替换没有在特定字符之前或之后的项目?,bash,replace,sed,perl,Bash,Replace,Sed,Perl,如何限制查找和替换以替换项目,但如果紧跟在“A”、“B”或“C”之前的字符或紧跟在“X”、“Y”或“Z”之后的字符,则不能这样做。例如,给定这些输入行,如果将“cat”替换为“pet”: “有一只猫。”→ “这是一只宠物。” “There is Acat.”保持不变,因为“A”在前面找到 “There is catY.”保持不变,因为“Y”位于后面 “There is CcatX.”保持不变,因为“C”在前面,而“X”在后面 假设您的文本位于名为text.txt的文件中。这将起作用: sed

如何限制查找和替换以替换项目,但如果紧跟在“A”、“B”或“C”之前的字符或紧跟在“X”、“Y”或“Z”之后的字符,则不能这样做。例如,给定这些输入行,如果将“cat”替换为“pet”:

  • “有一只猫。”→ “这是一只宠物。”
  • “There is Acat.”保持不变,因为“A”在前面找到
  • “There is catY.”保持不变,因为“Y”位于后面
  • “There is CcatX.”保持不变,因为“C”在前面,而“X”在后面

假设您的文本位于名为
text.txt的文件中。这将起作用:

sed -i 's/\(.*[^ABC]\|^\)cat\([^XYZ].*\|$\)/\1pet\2/g' text.txt
发生了什么(来自和):

这可能适用于您(GNU-sed):

或:


此sed应适用于您:

sed -r 's/(^|[^ABC])cat\>/\1pet/g; s/\<cat([^XYZ]|$)/pet\1/g' file
sed-r/(^ |[^ABC])cat\>/\1pet/g;s/\/\1pet/g;s/\使用可能是一个更好的主意,因为它支持向前看/向后看:

perl -lape 's/(?<![ABC])cat(?![XYZ])/pet/' input

perl-lape的/(?使用输入测试
cat是一只猫
,根据OP
“有猫”
应该变成
“有宠物”“
但这不行。用
猫是猫是猫
测试@cforbish:我用这个输入测试得到:
宠物是宠物是宠物
我得到
宠物是猫是宠物
。我还是投了你一票。
sed 's/\<cat\>/pet/g' file
sed -r 's/(\b|[^ABC])cat(\b|[^XYZ])/\1pet\2/g' file
sed -r 's/(^|[^ABC])cat\>/\1pet/g; s/\<cat([^XYZ]|$)/pet\1/g' file
sed -r 's/(^|[^ABC])cat\>/\1pet/g; s/\<cat([^XYZ]|$)/pet\1/g' <<< 'cat is a cat is a cat'
pet is a pet is a pet
perl -lape 's/(?<![ABC])cat(?![XYZ])/pet/' input