从命令行修改文本文件中的特定行

use*_*504 2 linux shell awk command-line sed

我有一个文本文件“text.txt”,它包含一堆带有文本(或空行)的行。

我试图形成一个单一的 sed/awk 命令行命令,它可以让我注释掉任何喜欢的东西(通过在我指定的任何行号的开头添加一个“#”)。

例如,文本文件可能看起来像: A B C D 并且我想发出一个指定行号 2 的命令,所以它看起来像: A #B C D 如果可以指定行的范围,那么可以修改多行,例如“2- 4" 或 2,3,4" 也有帮助。

我在 sed 中发现了关于 -n 和 -e 选项的(对我来说)相互矛盾的信息,只是不能像我希望的那样让它工作。我正在使用 Kubuntu 18.04。

有什么建议?谢谢。

我一直在将我在其他问题中发现的概念串在一起,例如必须保留该行,但在它的开头添加“#”,因此我将“s/(.*)/#$1/”作为回补。

我认为它可能会这样工作: 但是,我明白 这似乎有一些很好的部分,但是,它并没有像我希望的那样工作,它只处理一行,而不是所有行sed '2,4!s/(.)/#$1/' text.txt s/.: Event not found.cat text.txt | sed -n '2{s/(.)/#$1/;p}'

Dav*_*ica 6

sed给定行号,一个简单的替代品也可以工作,例如

sed -i '2s/^/# /' file
Run Code Online (Sandbox Code Playgroud)

上面的代码将file在注释行 2 的"# "开头插入注释。要将行号作为参数传递,请用双引号引用表达式,例如

#!/bin/bash

sed -i "$1s/^/# /" "$2"
Run Code Online (Sandbox Code Playgroud)

将行号作为第一个参数,将要注释的文件作为第二个参数,并就地编辑文件以进行注释。您应该验证第一个参数是整数,第二个参数是存在且非空的文件。如果您将脚本另存为cmt并使其可执行(例如chmod +x cmt),那么您可以将第二行注释为file

./cmt 2 file
Run Code Online (Sandbox Code Playgroud)


Rav*_*h13 5

这应该是 的任务awk。在此解决方案中,创建一个变量名称lines,其中包含行号,无论您想更改哪个(逗号分隔),只需提及其中包含逗号分隔值的任意数量的行号,这应该可以解决问题。在https://ideone.com/ajnNSU上测试成功

awk -v lines="2,3,4" '
BEGIN{
  num=split(lines,array,",")
  for(i=1;i<=num;i++){
    linechange[array[i]]
  }
}
FNR in linechange{
  $0="#" $0
}
1
' Input_file
Run Code Online (Sandbox Code Playgroud)