删除文件中第 n 行的文本

删除文件中第 n 行的文本

我想删除来自一行变量的字符串。 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

其中2ssubs on line 2hi(第一对斜杠中的模式)是要替换的模式,并且第二对斜杠之间没有任何内容导致该模式被删除。

此命令也适用于变量,但您必须小心地将命令括在双引号而不是单引号中,如下所示

remove_text=' hi'
sed "2s/${remove_text}//" filename

如果您想通过变量选择行号,您也可以这样做。

ln=2
remove_text=' hi'
sed "${ln}s/${remove_text}//" filename

使用选项-iwithsed将导致就地替换,或更新文件。

答案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

相关内容