我有一个包含内容的文件:
- 2 equal files of size 288903252
- 2 equal files of size 284164096
"C:\E\100p disk util bak\Softwares\OSs\gparted-live-0.26.1-1-i686.iso"
"H:\Softwares\Linux\gparted-live-0.26.1-1-i686.iso"
- 2 equal files of size 277436598
- 2 equal files of size 161356649
"H:\Softwares\Dev Tools\Eclipse\Windows\eclipse-java-luna-SR1a-win32-x86_64.zip"
- 35 equal files of size 97078976
"C:\Windows\System32\DriverStore\FileRepository\nvacwu.inf_amd64_9934c34dc6ca0c4b\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvamwu.inf_amd64_d4715679184092a8\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvaowu.inf_amd64_785608ed2524cdea\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvblwu.inf_amd64_31f54e2d1ba058d5\NvCplSetupInt.exe"
我想删除那些- X equal files of size
的行,而不是跟随它们的实际文件路径。例如第一和第三个要点:
- 2 equal files of size 284164096
"C:\E\100p disk util bak\Softwares\OSs\gparted-live-0.26.1-1-i686.iso"
"H:\Softwares\Linux\gparted-live-0.26.1-1-i686.iso"
- 2 equal files of size 161356649
"H:\Softwares\Dev Tools\Eclipse\Windows\eclipse-java-luna-SR1a-win32-x86_64.zip"
- 35 equal files of size 97078976
"C:\Windows\System32\DriverStore\FileRepository\nvacwu.inf_amd64_9934c34dc6ca0c4b\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvamwu.inf_amd64_d4715679184092a8\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvaowu.inf_amd64_785608ed2524cdea\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvblwu.inf_amd64_31f54e2d1ba058d5\NvCplSetupInt.exe"
我形成了一个匹配这些行的regex:
(^-.*\n)-
可以在上面的链接中检查。我想删除基本上整行的第一组。但无法猜测如何对grep
或sed
执行相同的操作。我们可以用单一命令做到这一点吗?
答案 0 :(得分:2)
使用sed
sed '/^-/{N;/\n-/D}' file
- 2 equal files of size 284164096
"C:\E\100p disk util bak\Softwares\OSs\gparted-live-0.26.1-1-i686.iso"
"H:\Softwares\Linux\gparted-live-0.26.1-1-i686.iso"
- 2 equal files of size 161356649
"H:\Softwares\Dev Tools\Eclipse\Windows\eclipse-java-luna-SR1a-win32-x86_64.zip"
- 35 equal files of size 97078976
"C:\Windows\System32\DriverStore\FileRepository\nvacwu.inf_amd64_9934c34dc6ca0c4b\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvamwu.inf_amd64_d4715679184092a8\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvaowu.inf_amd64_785608ed2524cdea\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvblwu.inf_amd64_31f54e2d1ba058d5\NvCplSetupInt.exe"
适用于任何sed版本的便携版
sed -e '/^-/{N' -e '/\
-/D' -e '}' file
如果您要删除最后一行-
sed -e '/^-/{$d' -e 'N' -e '/\
-/D' -e '}' file
答案 1 :(得分:1)
你可以发现它:
grep -v -B1 "^-" test_file.txt | grep -v "\-\-"
- 2 equal files of size 284164096
"C:\E\100p disk util bak\Softwares\OSs\gparted-live-0.26.1-1-i686.iso"
"H:\Softwares\Linux\gparted-live-0.26.1-1-i686.iso"
- 2 equal files of size 161356649
"H:\Softwares\Dev Tools\Eclipse\Windows\eclipse-java-luna-SR1a-win32-x86_64.zip"
- 35 equal files of size 97078976
"C:\Windows\System32\DriverStore\FileRepository\nvacwu.inf_amd64_9934c34dc6ca0c4b\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvamwu.inf_amd64_d4715679184092a8\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvaowu.inf_amd64_785608ed2524cdea\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvblwu.inf_amd64_31f54e2d1ba058d5\NvCplSetupInt.exe"
它是如何工作的?它只是选择所有行和它们之前的行,而不是以-
开头。第二个grep只删除了组分隔符,一些grep版本支持--no-group-separator
,所以你可以一次性完成。
答案 2 :(得分:0)
pepsi perl好吗?
cat input.txt | perl -pe 'BEGIN{undef $/;} s/^-.*?\n-/-/smg'
BEGIN
块允许多线搜索,实质上告诉perl没有行尾字符。然后,s/
部分会将与正则表达式匹配的任何部分替换为-
(不需要捕获组)。
哦,我用?
稍微修改你的正则表达式是贪婪的。否则,搜索是多行的,它将匹配从第一个-
到最后一个,并删除几乎所有内容。
修改:here is a lengthy and informative Q/A about multiline search,显示 sed
很难。
Edit2:使用现代sed
实际上非常简单,请参阅@ 123的回答
答案 3 :(得分:0)
sed用于单个行上的简单替换,即全部。对于其他任何你应该使用awk。如果你使用s,g和p以外的sed结构(带-n)那么你使用的结构在20世纪70年代中期发明时已经过时了。
对于任何UNIX机器上的任何awk,这都可以有效,高效和便携地工作:
$ awk '/^ /{print p $0; p=""; next} {p=$0 ORS}' file
- 2 equal files of size 284164096
"C:\E\100p disk util bak\Softwares\OSs\gparted-live-0.26.1-1-i686.iso"
"H:\Softwares\Linux\gparted-live-0.26.1-1-i686.iso"
- 2 equal files of size 161356649
"H:\Softwares\Dev Tools\Eclipse\Windows\eclipse-java-luna-SR1a-win32-x86_64.zip"
- 35 equal files of size 97078976
"C:\Windows\System32\DriverStore\FileRepository\nvacwu.inf_amd64_9934c34dc6ca0c4b\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvamwu.inf_amd64_d4715679184092a8\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvaowu.inf_amd64_785608ed2524cdea\NvCplSetupInt.exe"
"C:\Windows\System32\DriverStore\FileRepository\nvblwu.inf_amd64_31f54e2d1ba058d5\NvCplSetupInt.exe"