繁体   English   中英

仅当包含它的行不包含使用 Bash 的特定字符串时,如何替换文件中的字符串?

[英]How to replace a string in a file only if the line containing it does not also contain a specific string using Bash?

我想使用 Bash 在以下 file.csv 中用replace target所有实例,但前提是包含它的行不包含字符串skipline

文件.csv:

abc,abc,keepline,target,abc,abc
abc,abc,skipline,target,abc,abc

期望的输出:

abc,abc,keepline,replace,abc,abc
abc,abc,skipline,target,abc,abc

我正在尝试使用sed

sed 's/target/replace' file.csv > newfile.csv

如何包含检查字符串skipline每一行的逻辑?

您可以过滤需要搜索和替换的行

$ cat ip.txt 
abc,abc,keepline,target,abc,abc
abc,abc,skipline,target,abc,abc

$ sed '/skipline/! s/target/replace/' ip.txt 
abc,abc,keepline,replace,abc,abc
abc,abc,skipline,target,abc,abc

这将忽略包含skipline的行。 并用replace关键字替换目标。

   awk '!/skipline/ {gsub(/target/,"replace")}1' input
    abc,abc,keepline,replace,abc,abc
    abc,abc,skipline,target,abc,abc

要在原始文件中进行更改:

awk '!/skipline/ {gsub(/target/,"replace")}1' input >input.tmp && mv input.tmp input
% sed '/skipline/!s/target/replace/g' input
abc,abc,keepline,replace,abc,abc
abc,abc,skipline,target,abc,abc

sed则可以指定替换: /foo/用于搜索foo1,5装置从线1到5。 一个! 反转该搜索。

使用 Bash 和子字符串替换:

i=abc,abc,keepline,target,abc,abc
if [[ ! $i =~ "skipline" ]] ; then 
  i=${i//target/replace}
fi
echo $i
abc,abc,keepline,replace,abc,abc

i=abc,abc,skipline,target,abc,abc
if [[ ! $i =~ "skipline" ]] ; then 
  i=${i//target/replace}
fi
echo $i
abc,abc,skipline,target,abc,abc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM