【问题标题】:sed/awk substitute second occurrence of wildcard selectionsed/awk 替换第二次出现的通配符选择
【发布时间】:2014-10-28 05:15:44
【问题描述】:

我有一个文件.. 它有很多行,但相关的可能看起来像:

<name></name>
<name>LED_1</name>
<name>Action Button_8</name>
<name>Action Button_1</name>
<name>LED_1</name>
<name>Label_59</name>
<name>Label_83</name>

需要编辑这些名称以在运行时使用索引集,而我想在此处设置的另一个名称可以很好地保持它们的小部件类型(标签、LED 等)完好无损。任何文件中只有 3-7 行带有 /name> 的行,所以我不介意更改一个行来分别修复包含我的文件的文件夹中的每个事件。

我试过了:

sed -i 's/_.*<\/name>/_${DINDEX}_1<\/name>/2'

但我认为它希望替换每一行中的第二个出现,而不是文件中的第二个。 任何和所有的帮助表示赞赏!谢谢!

编辑: 想要的结果

<name></name>
<name>LED_${DINDEX}_1</name>
<name>Action Button_${DINDEX}_2</name>
<name>Action Button_${DINDEX}_3</name>
<name>LED_${DINDEX}_4</name>
<name>Label_${DINDEX}_5</name>
<name>Label_${DINDEX}_6</name>

【问题讨论】:

  • 这些行都来自一个文件吗?你想把这行翻译成什么?
  • 是的,它们都来自一个文件。我想在 _ 之前保留他们的名字。并替换他们必须说的任何数字 ${DINDEX}_0 用于第一次出现, ${DINDEX}_1 用于第二次出现等。我已经编辑了我的初始问题作为示例。 @EtanReisner

标签: xml bash perl awk sed


【解决方案1】:

使用 awk 你可以做到这一点:

awk '/<name>[^_]*_/ {sub(/_[^<]*/, "_${DINDEX}_" ++i)} 1' file
<name></name>
<name>LED_${DINDEX}_1</name>
<name>Action Button_${DINDEX}_2</name>
<name>Action Button_${DINDEX}_3</name>
<name>LED_${DINDEX}_4</name>
<name>Label_${DINDEX}_5</name>
<name>Label_${DINDEX}_6</name>

【讨论】:

  • 这很棒!如果我很贪婪,我会更进一步并迭代当前目录中的所有文件。谢谢! @anubhava
  • stackoverflow.com/a/15953868/3976689 一样,我想迭代当前目录中的文件。而且还要用输出覆盖用作输入的文件。这很容易做到吗?希望可以问这样的连续问题。再次感谢你。 @anubhava
  • 你可以这样做:for f in *; do awk '/&lt;name&gt;[^_]*_/ {sub(/_[^&lt;]*/, "_${DINDEX}_" ++i)} 1' "$f" &gt; "$f".tmp &amp;&amp; mv "$f".tmp $f"; done。希望对您有所帮助。
  • 这确实很有帮助。这是一个工具,我将用它来改造带有独特小部件名称标签的 XML 编码模板,使它们在屏幕开发中更易于管理。
  • 可以注意到在最后一个$f之前少了一个"
【解决方案2】:

@Daniel Crisp:在命令提示符下使用 perl one liner 可以获得相同的输出:

perl -lpe "$n;s/_[^<]*/_\${DINDEX}_$n/;$n=$n+1" inputfile 

【讨论】:

  • 这将针对单个文件,其中 $n 是出现的索引?我可以简单地植入它而不是上面的 awk 脚本,并在 *; 中为 f 使用相同的脚本吗?做“__________”“$f”>“$f”.tmp && mv“$f”.tmp“$f”;完成了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2016-04-02
  • 2012-02-27
相关资源
最近更新 更多