Sed用下划线替换连字符

时间:2017-12-06 16:11:43

标签: regex sed replace

新正则表达式并有问题。我想在文件的某些位置用下划线替换连字符。为简化起见,假设我想替换第一个连字符。这是一个示例“文件”:

dont-touch-these-hyphens
leaf replace-these-hyphens

我想替换

找到的所有行中的连字符
grep -P "leaf \w+-" file

我试过

sed -i 's/leaf \(\w+\)-/leaf \1_/g' file

但没有任何反应(错误的替换会比没有更好)。我尝试了一些调整但仍然没有。再说一遍,我是新手,所以我认为上面“基本上应该工作”。它有什么问题,我怎么得到我想要的东西?感谢。

2 个答案:

答案 0 :(得分:4)

您可以使用两个不同的正则表达式简化事物;一个用于匹配需要处理的行,另一个用于匹配必须修改的行。

您可以尝试这样的事情:

$ sed '/^leaf/ s/-/_/' file
dont-touch-these-hyphens
leaf replace_these-hyphens

答案 1 :(得分:1)

只需使用awk:

Public Class SendtoUI
   Private backgroundTimer As System.Timers.Timer
   Public Sub New()
      backgroundTimer = New Timers.Timer(1000)
      AddHandler backgroundTimer.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf backgroundTimer_Elapsed)
      backgroundTimer.Start()
   End Sub

   'SynchronizationContext used for Posting
   Public Property SyncContext As System.Threading.SynchronizationContext
   'The Object Callback address to call
   Public Property SyncCallback As System.Threading.SendOrPostCallback

   Private Sub backgroundTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)

      SyncContext.Post(SyncCallback, CType(DateTime.Now.ToLongTimeString, Object))

   End Sub
End Class

它可以更准确地控制你匹配的内容(例如,上面是在“leaf”上进行字符串而不是regexp比较,所以即使该字符串包含regexp元字符,如$ awk '$1=="leaf"{ sub(/-/,"_",$2) } 1' file dont-touch-these-hyphens leaf replace_these-hyphens 或者.)以及您要替换的内容(例如,以上内容仅在*之后的文本中进行替换,即使leaf本身包含leaf s,也会继续有效):

-

正确输出:

$ cat file
dont-touch-these-hyphens
leaf-foo.*bar replace-these-hyphens
leaf-foobar dont-replace-these-hyphens

输出错误:

$ awk '$1=="leaf-foo.*bar"{ sub(/-/,"_",$2) } 1' file
dont-touch-these-hyphens
leaf-foo.*bar replace_these-hyphens
leaf-foobar dont-replace-these-hyphens

(注意leaf-foo中的“ - ”在最后两行中的每一行中都被“_”替换,包括那个不以字符串“leaf-foo。* bar”开头的那个。)

awk脚本将在任何UNIX机器上使用任何awk原样工作。