我想$cont
使用替换文件中以变量内容开头的行awk
。
5473 12G Ju 2 06:32 part3
5423 11G Ju 6 07:32 part4
573 11G Ju 2 08:21 part5
5473 11G Ju 6 09:12 part6
5423 1G Jl 6 09:32 part7
我sed
现在正在使用,但花了太多时间来做同样的事情。
sed
代码如下。
现在我将找到并删除以 开头的行$cont
并将其写入$cont
文件。
cont="foo"
newLineCont ="this is new line"
parallel -a test.txt -k --block 30M --pipe-part "sed -i /^$cont/d" test.txt
echo $newLineCont >> test.txt
想要使用 AWK 搜索文件中以变量 $cont 的内容开头的行并将其替换为 $newLineCont 的内容
答案1
$newLineCont
如果第一个空格分隔字段等于 ,则将每一整行替换为$cont
:
awk -v c="$cont" -v nc="$newLineCont" '$1 == c { $0 = nc } 1' <infile >outfile
这将读取infile
并创建一个名为 的新文件outfile
。如果一行的第一个字段等于$cont
,则整行将被替换为$newLinecont
。
尾随1
是一种简短的书写方式{ print }
,将导致所有行被输出。
服用史蒂芬·查泽拉斯 (Stéphane Chazelas) 评论如下考虑到(如果一个或两个变量包含反斜杠):
env c="$cont" nc="$newLineCont" awk '$1 == ENVIRON["c"] { $0 = ENVIRON["nc"] } 1' <infile >outfile
使用sed
:
sed "s/^$cont[^0-9].*/$newLineCont/" <infile >outfile
使用 时sed
,我们必须更加小心地在没有正则表达式的情况下匹配正确的内容。如果$cont
是12
,我们做不是想要匹配以 . 开头的行123
。这就是为什么我在$cont
with之后显式匹配非数字[^0-9]
(我假设$cont
是一个数字)。
与该awk
命令一样,它读取infile
并写入outfile
.
如果$cont
或$newLineCont
包含斜杠,则必须将它们转义为\/
,并且如果$cont
包含正则表达式中的任何其他特殊字符,则也需要正确转义它们。