【问题标题】:Delete 28 Characters before a matching pattern and replace with a letter删除匹配模式前的 28 个字符并替换为字母
【发布时间】:2014-07-31 20:47:49
【问题描述】:

我有一个长文件,我想在匹配前删除 27 个字符并在匹配前替换一个字母

example 123456789123456789123456789Replace

所以输出应该是

"aReplace"

(删除“替换”前的28个字母,并在“替换”前添加字母“a”)

我没有使用实际的文件并且图案太大

【问题讨论】:

  • 它是一个长文件,我想在匹配模式之前删除 27 个字母,这里的模式是“替换”,删除后我想要一个字符(在本例中为“a”)“a”被放置在“替换”前面,所以输出看起来像“aReplace”@AriTrachtenberg
  • 有时您说“删除 28”,有时您说“删除 27”。您显示的测试字符串在 Replace 之前有 27 个字符。你能在你的问题上保持一致吗?
  • @user3723229,当您提出问题时,您确实需要更加准确和清晰。您提到的字符数不仅存在差异,而且还用引号显示输出。是带引号还是不带引号?它确实会影响某人回答您知道的问题的方式。
  • 对不起,我把它的 28 搞糊涂了

标签: regex unix sed terminal cut


【解决方案1】:

如果您希望将 Replace(根据您的问题的标题)之前的 28 个字符替换为字母 a,您可以使用

sed 's/.\{28\}Replace/aReplace/'

请注意,您提供的字符串只有 27 个字符……(也反映在您的文本正文中) - 所以您会想要

sed 's/.\{27\}Replace/aReplace/'

在包含123456789123456789123456789Replace 的行中获取aReplace

假设你的文本文件是myFile.txt,你的完整命令是

cat myFile.txt | sed 's/.\{27\}Replace/aReplace/' > newFile.txt

这会将修改后的内容放入新文件newFile.txt - 它允许您在覆盖输入文件之前确认它按计划工作...

【讨论】:

  • 您忘记了替换周围的引号"
  • @l'L'l - 我不需要它们?为什么要引用一个字符串?
  • 输出显示他们想要"aReplace" 而不是aReplace
  • 很确定 OP 没有要求添加引号,因为文本声明“在 'Replace' 之前删除 28 个字母 (sic) 并在前面添加字母 'a' '替换'"
  • 一个永远不知道,但用引号清楚地显示so the output should be "aReplace"
【解决方案2】:

可能有用的 Perl 单行代码。

perl -pe 's/.{27}(?=Replace)/a/g' file

【讨论】:

    【解决方案3】:

    使用 sed:

    echo '123456789123456789123456789Replace' | sed -e 's/.\{27\}Replace/"aReplace"/g'
    

    输出:

    "aReplace"
    

    【讨论】:

    • 您的表达式假设 27 个字符从行首开始 ^ - 我认为问题中没有明确说明。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2018-07-03
    • 2020-07-12
    • 2013-07-04
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多