我想删除来自一行变量的字符串。
remove_text=' hi'
;
文件:
kjdkjdkjddkjd
djdk hi sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk
我想hi
从第 N行删除(在本例中为第 2 行。)
文件:
kjdkjdkjddkjd
djdk sjjsj
jfjf sisj hi
jdkjdk dkjdkdjd hi
hi sksk
答案1
很简单sed
。
sed '2s/hi//' filename
其中2s
subs on line 2
,hi
(第一对斜杠中的模式)是要替换的模式,并且第二对斜杠之间没有任何内容导致该模式被删除。
此命令也适用于变量,但您必须小心地将命令括在双引号而不是单引号中,如下所示
remove_text=' hi'
sed "2s/${remove_text}//" filename
如果您想通过变量选择行号,您也可以这样做。
ln=2
remove_text=' hi'
sed "${ln}s/${remove_text}//" filename
使用选项-i
withsed
将导致就地替换,或更新文件。
答案2
使用任何awk:
remove_text=' hi';
awk -v rmtxt="$remove_text" '
NR==2{ len=length(rmtxt); ind=index($0, rmtxt);
print substr($0, 1, ind-1) substr($0, ind+len)
}1' infile
或者使用match()
函数(match() 将第二个参数视为正则表达式):
awk -v rmpat="$remove_text" '
NR==2{ match($0, rmpat);
print substr($0, 1, RSTART-1) substr($0, RSTART+RLENGTH)
}1' infile
特别是这是为了找到“的第一次出现位置删除文本" 在输入的第二行中打印两个子字符串,一个在前面,另一个在后面。
如果你想删除所有出现的“删除文本”,按如下方式进行:
awk -v rmtxt="$remove_text" 'BEGIN { FS=rmtxt; OFS="" } NR==2{ $1=$1 }1' infile
这就是定义“删除文本" 作为 awk 的字段分隔符,并在输入的第二行上根据 FS/OFS 重新评估输入行并打印1
使用的最终更改。
或者,使用gsub()
函数,但请注意使用 gsub() 将处理“删除文本“ 值作为正则表达式不是上述解决方案基于字符串匹配的文字字符串:
awk -v rmpat="$remove_text" 'NR==2{ gsub(rmpat, "") }1' infile