You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用SED工具处理匹配hdfs的行:两次修改并移除原行?

可以用SED结合缓冲区实现需求

完全可以通过SED的保持缓冲区(hold buffer)来完成这个需求,核心思路是暂存原始行,基于原行生成两个修改后的行,再跳过原行的默认输出。以下是具体实现方案:

假设原文件结构示例

先假设你的类似fstab的文件字段用任意空白(空格/制表符)分隔,比如test.fstab内容:

123  /mnt/local  local_disk
456  hdfs://cluster/data  data_storage
789  hdfs://cluster/logs  log_storage
012  /tmp  temp_dir

SED命令实现

sed -E '/hdfs/ {
    # 把当前匹配行存入保持缓冲区,暂存原始内容
    h
    # 需求1:保留原ID,给行末名称加_old后缀并打印
    s/(\S+)$/\1_old/
    p
    # 从保持缓冲区恢复原始行内容到模式空间
    g
    # 需求2:根据hdfs路径替换为对应固定ID,保留原名称并打印
    # 这里示例映射:hdfs://cluster/data → abc,hdfs://cluster/logs → def
    s/^(\S+)\s+(hdfs:\/\/cluster\/data)/abc\2/
    s/^(\S+)\s+(hdfs:\/\/cluster\/logs)/def\2/
    p
    # 删除原行,避免默认打印原始行
    d
}' test.fstab

命令解释

  • /hdfs/ { ... }:仅对包含hdfs的行执行大括号内的操作,非hdfs行自动原样输出
  • h:将当前行复制到保持缓冲区,确保后续两次修改都基于原始内容
  • s/(\S+)$/\1_old/:匹配行末的非空白字段(即名称),替换为原名称_old,然后用p打印这行(对应需求1)
  • g:把保持缓冲区里的原始行恢复到模式空间,回到修改前的状态
  • 两个s命令:根据不同的hdfs路径替换行首的ID字段,你可以根据实际的路径-ID映射添加更多类似规则,完成后用p打印这行(对应需求2)
  • d:删除模式空间里的原始行,阻止SED默认打印原行

输出结果

执行命令后,原文件的输出会变成:

123  /mnt/local  local_disk
456  hdfs://cluster/data  data_storage_old
abc  hdfs://cluster/data  data_storage
789  hdfs://cluster/logs  log_storage_old
def  hdfs://cluster/logs  log_storage
012  /tmp  temp_dir

适配不同字段分隔

如果你的文件字段是严格制表符分隔,只需把正则里的\s+换成\t,\S+换成[^\t]+即可,比如修改需求1的替换规则为s/([^\t]+)$/\1_old/,ID替换规则里的\s+换成\t。

内容的提问来源于stack exchange,提问作者TheStromp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:00:58