【发布时间】:2017-06-25 07:50:52
【问题描述】:
我知道这个问题已经以不同的方式被提出和回答。但我的重点是为什么 sed 的行为不像我期望的 vi 那样。
对于给定的线程转储文件,我需要在“锁定可拥有同步器”的每一行之前删除换行符,如下所示。
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at com.project.tools.threads.NamedThread.run(NamedThread.java:37)
Locked ownable synchronizers:
- None
我可以使用 vi 做到这一点:
:g/^M Locked ownable synchronizers/s// Locked ownable synchronizers/g
^^^ ^M 是 ctrl-M。上面的 vi 命令有效,即它成功地删除了 Locked 之前的换行符。但是,当我尝试在 sed 中使用它时,以下都不起作用(我尝试了多种方法来表示换行符,但都没有奏效)。
sed -i'' -e 's/^M Locked ownable synchronizers/ Locked ownable synchronizers/g' file.threaddump
sed -i'' -e 's/\n Locked ownable synchronizers/ Locked ownable synchronizers/g' file.threaddump
sed -i'' -e 's/\r Locked ownable synchronizers/ Locked ownable synchronizers/g' file.threaddump
sed -i'' -e 's/\r\n Locked ownable synchronizers/ Locked ownable synchronizers/g' file.threaddump
据我了解,vi 命令在 sed 中工作(而且它们一直是)。这个怎么不行啊???
谢谢
PS:有效的解决方案是使用 perl:
perl -0pe 's/\n Locked ownable synchronizers:/ Locked ownable synchronizers:/g' < file.threaddump
但我想弄清楚为什么 sed 不起作用!
【问题讨论】: