使用 sed 替换特定行号的文本

使用 sed 替换特定行号的文本

我有一个 html 文件users.html,我想替换第一行。第一行如下所示

<template name="AccountSettings">

我希望第一行是

<template name="Users">

答案1

sed接受命令地址范围。在这种情况下,为了将替换限制在第一行,范围应该是单个地址1,即

sed '1 s/AccountSettings/Users/' users.html

答案2

Perl

$ perl -pi -e 's/AccountSettings/Users/ if $. == 1' input.txt
  • -pi允许对输入文件进行就地更改,即更改实际文件。如果您想在覆盖文件之前查看结果,请-p使用
  • s/AccountSettings/Users/对模式进行第一次替换。
  • $.已处理行数

大王

$ awk 'NR==1{sub("AccountSettings","Users")};1' input.txt                
<template name="Users">
AccountSettings
  • NR==1{sub("AccountSettings","Users")}Pattern or Condition {actions}awk 的典型结构。当条件为真时执行操作。
  • NR==1{}是处理的行数,具体来说,我们正在查看行数是否等于 1。
  • sub("AccountSettings","Users")对模式的第一个匹配执行替换。
  • 1是省略了操作的模式。模式为真的默认操作是打印,并且使模式为可1确保我们打印结果行。

Python

一句话解读stdin

$ python -c 'import sys;print("\n".join([ l.strip().replace("AccountSettings","Users") if i==0 else l.strip()  for i,l in enumerate(sys.stdin)]))' < input.txt

脚本版本:

#!/usr/bin/env python
from sys import argv;
with open(argv[1]) as f:
    for index,line in enumerate(f):
        text = line.strip().replace("AccountSettings","User") if index == 0 else line.strip()
        print(text)
  • 核心思想是重定向stdin流并从那里读取行或提供文件作为argv[1]脚本的第一个命令行参数
  • 我们使用variable = value_1 if condition else value_2结构在一行中构建具有适当值的行列表,而在脚本版本中,将对text变量进行赋值并立即打印该变量。替换的条件当然是行号

红宝石

$ ruby -pe '$_=$_.sub(/AccountSettings/,"Users") if $. == 1' input.txt                                                                             
<template name="Users">
AccountSettings
  • 与 Perl 类似的想法, switch 允许我们每次-p 打印(当前行)变量。$_
  • $_=$_.sub(/AccountSettings/,"Users") if $. == 1action if condition结构,我们使用.sub()函数执行模式替换,$_如果行号为 1,则将其分配回缓冲区

答案3

使用以下命令:

sed   's/name="AccountSettings"/name="Users"/g' users.html

相关内容