新正则表达式并有问题。我想在文件的某些位置用下划线替换连字符。为简化起见,假设我想替换第一个连字符。这是一个示例“文件”:
dont-touch-these-hyphens
leaf replace-these-hyphens
我想替换
找到的所有行中的连字符grep -P "leaf \w+-" file
我试过
sed -i 's/leaf \(\w+\)-/leaf \1_/g' file
但没有任何反应(错误的替换会比没有更好)。我尝试了一些调整但仍然没有。再说一遍,我是新手,所以我认为上面“基本上应该工作”。它有什么问题,我怎么得到我想要的东西?感谢。
答案 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原样工作。