【问题标题】:Modifying a particular line in a text file from the command-line从命令行修改文本文件中的特定行
【发布时间】:2023-03-23 06:18:01
【问题描述】:

我有一个文本文件“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/(.<em>)/#$1/' text.txt </em> 但是,我得到s/.: Event not found. 这似乎有一些好的部分,但是,它并没有像我希望的那样工作,它只处理一行,而不是所有行cat text.txt | sed -n '2{s/(.)/#$1/;p}'

【问题讨论】:

  • 欢迎来到 SO,在 SO 上,我们确实鼓励用户添加他们为解决自己的问题而付出的努力,所以请在您的问题中添加相同的内容,然后让我们知道。
  • 你为什么要否定地址?如果你想在第 2 行到第 4 行的开头添加 #,只需执行 sed -e '2,4s/^/#/'

标签: linux shell awk sed command-line


【解决方案1】:

这应该是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

【讨论】:

    【解决方案2】:

    一个简单的sed 替换也可以在给定行号的情况下工作,例如

    sed -i '2s/^/# /' file
    

    上面将编辑file 在注释第2 行的地方,在行首插入"# "。要将行号作为参数传递,双引号表达式,例如

    #!/bin/bash
    
    sed -i "$1s/^/# /" "$2"
    

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

    ./cmt 2 file
    

    【讨论】:

    • 很高兴它有帮助。祝你的脚本好运!
    猜你喜欢
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多