我有一个 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 $. == 1
是action if condition
结构,我们使用.sub()
函数执行模式替换,$_
如果行号为 1,则将其分配回缓冲区
答案3
使用以下命令:
sed 's/name="AccountSettings"/name="Users"/g' users.html