当前位置: 首页 > 知识库问答 >
问题:

sed自动替换是否到位?

云洋
2023-03-14

我有这个代码,我确实想要一个特定模式的替换,但不是多就地替换。

 echo "ss qq" | sed  "s/ss/qq/g; s/qq/dd/g;"

结果是

dd dd

但愿如此

qq dd

同样,通过“循环”,我们得到了相同的结果。

echo "ss qq" | sed  ":loop; s/ss/qq/g; s/qq/dd/g; t loop;"

它很小,非常令人失望!!

有什么建议说明为什么会这样吗?

共有3个答案

柳飞飙
2023-03-14

可能是您正在查找的y//命令的行为:

▶ echo "ss qq" | sed 'y/sq/qd/'                 
qq dd

这将逐个字符将所有s转换为q,并将所有q转换为d

松英叡
2023-03-14

希望它会是

qq dd

然后按相反顺序进行替换:

更改sed“s/ss/qq/g;s/qq/dd/g;” -

鲁望
2023-03-14

至于“为什么会这样”:sed逐行获取输入,然后按顺序应用每个命令。如果查看命令的GNU sed(4.6或更新版本)的调试输出,这一点会更加清楚:

$ sed --debug 's/ss/qq/g;s/qq/dd/g' <<< 'ss qq'
SED PROGRAM:
  s/ss/qq/g
  s/qq/dd/g
INPUT:   'STDIN' line 1
PATTERN: ss qq           # Pattern space before first command is applied
COMMAND: s/ss/qq/g
MATCHED REGEX REGISTERS
  regex[0] = 0-2 'ss'
PATTERN: qq qq           # Pattern space before second command is applied
COMMAND: s/qq/dd/g
MATCHED REGEX REGISTERS
  regex[0] = 0-2 'qq'
PATTERN: dd dd
END-OF-CYCLE:
dd dd
 类似资料:
  • 文件txt只有一行: 我想删除110之后的所有数据。我试过了 它不起作用,为什么? 谢谢

  • 问题内容: 我需要替换Linux文本文件中所有出现的控制字符CTRL + A(SOH / ascii 1),如何在SED中实现呢? 问题答案: 可以使用(等同于选项并将其通过管道传递到)完成。 如果控制字符是标题(SOH)字符的开始(CTRL + A / ASCII 1),并且我们希望将其替换为制表符,则可以执行以下操作: 会将SOH字符替换为^ A,然后将其匹配并替换为。

  • 问题内容: 如果我从脚本运行以下命令: 没事。 但是,如果我运行: 我在教程中读到,要从shell替换环境变量,您需要先停止操作,然后对部分进行“引用”,以便不直接替换该部分,这是我所做的,并且仅当该变量在紧接之前定义时才起作用。 我如何被s识别为shell中定义的环境变量? 问题答案: 您的两个示例看起来相同,这使问题难以诊断。潜在问题: 您可能需要双引号,例如 可能包含一个斜杠,在这种情况下,

  • 问题内容: 我在JLabel中显示一些文本。基本上,我是动态生成该文本的,然后应用一些HTML标记(例如和)来格式化文本。最后,我将此格式文本分配给我的JLabel。 现在,我希望Jlabel在到达屏幕末尾时自动将文本换行到下一行,例如“记事本”中的“自动换行”功能。 我怎样才能做到这一点? 问题答案: 可以为使用HTML样式(CSS)设置宽度。反过来,这将确定要渲染的行数,并由此确定标签的首选高

  • 问题内容: 我对bash / sed没什么问题。我需要能够在sed表达式中使用命令替换。我有两个大文本文件: 首先是logfile.txt, 有时*以 错误ID:0xdeadbeef的格式按ID显示错误消息(常见示例为0xdeadbeef)。 第二个error.txt具有成对存储的错误消息LONG_ERROR_DESCRIPTION,0xdeadbeef 我试图用sed和bash命令替换来完成任务

  • 问题内容: 尝试用sed替换字符串时发生奇怪的事情。这有效: 因此,当我手动键入字符串时,它可以工作。但在以下情况下,不会发生替换: 当我回显这两个变量PATTERN和REPLACEMENT时,它们具有正确的值。 我试图用配置目录中所有文件中的替换字符串替换所有出现的模式字符串。 问题答案: 尝试 代替。’引号不会扩展变量。