![](/img/trans.png)
[英]How to replace a string in a file only if the line containing it also contains a number found in another file using 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/
用于搜索foo
, 1,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.