sed基础

image
image
-n 不加会打印全文 -n不让打印全文 屏蔽默认输出 3p第三行 行:横起的
image
image
image
image
数据定位
image
image
image
image
image
image
image
image
image
ens33我用的dhcp配置的 右斜线屏蔽,防止报错
image
image
image
image
image
image
image
image
image
image
image
image
image
c 以行为单位替换 s 以关键词为单位替换
image
这个错误是因为 sed 的替换命令格式不正确,具体来说是 替换操作的分隔符没有正确终止

1. sed 替换命令的语法规则

sed 的替换命令格式为:

sed 's/模式/替换内容/标志' 文件名
  • s 表示“替换”操作;
  • 第一个 /模式和替换内容的分隔符(也可以用 #@ 等符号代替,只要前后一致);
  • 中间的 模式 是要匹配的内容,替换内容 是替换后的结果;
  • 最后的 / 用来终止替换内容,后面还可以跟标志(比如 g 表示全局替换)。

2. 分析你的命令哪里错了

你的命令是:

sed 's/2046/xxxx' test.txt
  • 格式上,s/2046/xxxx 只有 两个 /
    • 第一个 / 分隔“模式”(2046)和“替换内容”(xxxx);
    • 缺少第三个 / 来终止替换内容,导致 sed 无法识别命令的结束位置,因此报错 “未终止的's'命令”

3. 正确的写法

补充最后一个 / 即可:

sed 's/2046/xxxx/' test.txt
  • 如果需要全局替换(每行的所有匹配都替换,而不是只替换第一个),可以加 g 标志:
    sed 's/2046/xxxx/g' test.txt
    

额外知识:分隔符可以自定义

如果模式或替换内容里本身有 /,为了避免冲突,可以换其他分隔符(比如 #):

# 用 # 作为分隔符,避免和 URL 里的 / 冲突
sed 's#http://old#https://new#' test.txt

只要三个分隔符一致即可(开头 s 后的分隔符、模式和替换的分隔符、终止符必须相同)。
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
image
案例集
image
image
image
image
image
image
image
image
image
image
image
image
使用 https://www.tmooc.cn 下载 网站源代码
image
image
image
image
image
要解释这条 sed 命令,我们可以拆解为 选项、地址、替换规则 三部分分析:

1. 命令结构回顾

sed -i '1s/^.*$/<?xml version="1.0" encoding="UTF-8"?>/' tmp.txt  

sed流编辑器,用于批量处理文本内容。格式为:

sed [选项] '地址+操作' 文件名  

2. 逐部分解析

(1)选项 -i

  • 作用:直接修改文件内容(in-place 编辑),而非仅输出到终端。
  • 风险:会覆盖原文件!建议先测试(比如去掉 -i,查看输出是否符合预期,再修改文件)。

(2)地址 1

  • 含义:指定对 第1行 进行操作(sed 中地址可以是行号、正则等,这里 1 代表第一行)。

(3)替换操作 s/^.*$/<?xml version="1.0" encoding="UTF-8"?>/

这是 sed替换命令,格式为 s/正则表达式/替换内容/

  • ^.*$:正则表达式,匹配 整行内容

    • ^:行的开头;
    • .*:任意字符(除换行)重复 0 次或多次(即“任意内容”);
    • $:行的结尾。
      合起来,^.*$ 会匹配 一行的全部内容(无论该行原本是什么,包括空行)。
  • <?xml version="1.0" encoding="UTF-8"?>:替换后的内容,是 XML 文件的标准声明行。

3. 整体效果

这条命令会:

  1. 找到 tmp.txt 文件的 第一行
  2. 不管该行原来是什么内容(甚至是空行),都替换为 <?xml version="1.0" encoding="UTF-8"?>
  3. 直接修改 tmp.txt 文件(因 -i 选项)。

扩展思考

  • 如果想 备份原文件(避免误操作),可加后缀:sed -i.bak '...' tmp.txt,会生成 tmp.txt.bak 备份。
  • 如果文件 没有第一行(空文件),执行后会 插入 这一行(因为 1s 会匹配“空的第一行”并替换)。
  • 若只想替换 非空的第一行,可调整正则为 ^.+$+ 表示至少1个字符)。

理解后,就能灵活用 sed 批量修改文本啦!
sed -i 's/.*src="//' tmp2.txt 具体解释
这条 sed 命令的作用是 删除文件中每行里“第一个 src=" 及其之前的所有内容”,我们逐部分解析:

1. 命令结构拆解

sed -i 's/.*src="//' tmp2.txt  

遵循 sed 基本格式:sed [选项] '操作' 文件名

2. 各部分含义

(1)选项 -i

  • 与之前解释的一致,代表 “原地编辑”(in-place),直接修改 tmp2.txt 文件内容,而非仅输出到终端。
  • 注意:此操作会直接覆盖原文件,建议先去掉 -i 测试输出(如 sed 's/.*src="//' tmp2.txt),确认效果后再执行修改。

(2)核心操作 s/.*src="//

这是 sed 的替换命令,格式为 s/匹配模式/替换内容/(此处替换内容为空,即删除匹配到的部分)。

  • 匹配模式 .*src="

    • .*:正则表达式中,. 代表“任意单个字符”,* 代表“前面的字符重复 0 次或多次”,合起来 .* 表示“任意字符组成的任意长度内容”(从行首开始匹配)。
    • src=":固定字符串,即我们要定位的目标文本。
    • 整体 .*src=" 表示:从行首开始,匹配所有字符,直到遇到第一个 src="(包括 src=" 本身)
  • 替换内容为空
    由于 // 中间没有任何内容,意味着将匹配到的 .*src=" 这部分直接删除。

(3)文件 tmp2.txt

表示要处理的目标文件。

3. 实际效果举例

假设 tmp2.txt 中有一行内容:

<div class="img-box">src="logo.png" alt="logo"</div>  

执行命令后,这行会变成:

logo.png" alt="logo"</div>  

(原行中“从开头到 src="”的部分 <div class="img-box">src=" 被删除了)

注意点

  • 只处理 每行第一个出现的 src="sed 的替换默认只匹配每行的第一个符合条件的内容,若一行中有多个 src=",只会删除第一个之前的内容。
  • 若行中没有 src=":该行不会被修改,保持原样。

通过这个命令,可以快速提取 src=" 后面的内容(如图片路径、链接等)。
image
image
sed -i 's/".*//' tmp2.txt
这条 sed 命令的作用是 删除文件中每行里“第一个双引号 "" 及其之后的所有内容”,仅保留双引号之前的部分。我们逐部分解析:

1. 命令结构拆解

sed -i 's/".*//' tmp2.txt  

遵循 sed 基本格式:sed [选项] '替换操作' 目标文件

2. 各部分含义

(1)选项 -i

  • 与之前的命令一致,代表 “原地编辑”(in-place),直接修改 tmp2.txt 的内容(而非仅输出到终端)。
  • 注意:此操作会直接覆盖原文件,建议先去掉 -i 测试效果(如 sed 's/".*//' tmp2.txt),确认无误后再执行修改。

(2)核心替换操作 s/".*//

这是 sed 的替换命令,格式为 s/匹配模式/替换内容/(此处替换内容为空,即删除匹配到的部分)。

  • 匹配模式 ".*

    • ":表示匹配 第一个双引号(注意是英文双引号)。
    • .*:正则表达式中,. 代表“任意单个字符”,* 代表“前面的字符重复 0 次或多次”,合起来 .* 表示“双引号后面的所有内容”(无论是什么字符,直到行尾)。
    • 整体 ".* 表示:从行中第一个双引号开始,包括这个双引号,以及它后面的所有字符
  • 替换内容为空
    由于 // 中间没有任何内容,意味着将匹配到的 ".* 这部分直接删除。

(3)文件 tmp2.txt

表示要处理的目标文件。

3. 实际效果举例

假设 tmp2.txt 中有以下内容:

logo.png" alt="logo" class="img"  
https://example.com" target="_blank  
hello"world"test  

执行命令后,内容会变成:

logo.png  
https://example.com  
hello  
  • 第一行:删除了第一个 " 及其后的 alt="logo" class="img",仅剩 logo.png
  • 第二行:删除了第一个 " 及其后的 target="_blank,仅剩 https://example.com
  • 第三行:只删除第一个 " 及其后的 world"test(注意:即使后面还有其他双引号,也只处理第一个),仅剩 hello

注意点

  • 只处理 每行第一个双引号sed 替换默认只匹配每行的第一个符合条件的内容,若一行有多个双引号,仅删除第一个及其后的所有内容。
  • 若行中没有双引号:该行不会被修改,保持原样。

通过这个命令,可以快速提取文本中“第一个双引号之前的内容”(例如从带引号的字符串中提取前缀)。
image
修改
image
image
image
image
image
image
image
image

posted on 2025-07-29 09:22  爱尔奎特‘殷’  阅读(3)  评论(0)    收藏  举报