【发布时间】:2020-01-24 23:47:08
【问题描述】:
我有一个巨大的文本文件。我需要替换这三行的所有出现 模式:
|pattern|some data|
|giberish|,,
|pattern|some other data|
模式的最后一行:
|pattern|some other data|
删除模式的前两行,只保留最后一行。
- 模式的第二行以两个逗号结尾,不以
|pattern|开头 - 模式行的第一行以
|pattern|开头,不以两个逗号结尾。 - 模式行的第三行以
|pattern|开头,不以两个逗号结尾。
我试过了:
sed 'N;N;/^|pattern|.*\n.*,,\n|pattern|.*/I,+1 d' trial.txt
运气不好
编辑:这是一个更重要的例子
#!/usr/bin/env bash
cat > trial.txt <<EOL
|pattern|sdkssd|
|.x,mz|e,dsa|,,
|pattern|sdk;sd|
|xl'x|cxm;s|,,
|pattern|aslkaa|
|l'kk|3lke|,,
|x;;lkaa|c,c,s|
|-0-ses|3dsd|
|xk;xzz|'l3ld|
|0=9c09s|klkl32|
|d0-zox|m,3,a|
|x'.za|wkl;3|
|=-0poxz|3kls|
|x-]0';a|sd;ks|
|wsd|756|
|sdw|;lksd|
|pattern|askjkas|
|xp]o]xa|lk3j2|,,
|]-p[z|lks|
EOL
它应该变成:
|pattern|aslkaa|
|l'kk|3lke|,,
|x;;lkaa|c,c,s|
|-0-ses|3dsd|
|xk;xzz|'l3ld|
|0=9c09s|klkl32|
|d0-zox|m,3,a|
|x'.za|wkl;3|
|=-0poxz|3kls|
|x-]0';a|sd;ks|
|wsd|756|
|sdw|;lksd|
|pattern|askjkas|
|xp]o]xa|lk3j2|,,
|]-p[z|lks|
@zdim:
文件的前三行:
|pattern|sdkssd|
|.x,mz|e,dsa|,,
|pattern|sdk;sd|
满足模式。所以他们被替换为
|pattern|sdk;sd|
所以文件的顶部现在变成了:
|pattern|sdk;sd|
|xl'x|cxm;s|,,
|pattern|aslkaa|
|l'kk|3lke|,,
...
其中的前三行是:
|pattern|sdk;sd|
|xl'x|cxm;s|,,
|pattern|aslkaa|
满足模式,所以替换为:
|pattern|aslkaa|
所以现在文件的顶部是:
|pattern|aslkaa|
|l'kk|3lke|,,
|x;;lkaa|c,c,s|
|-0-ses|3dsd|
....
@JosephQuinsey:
考虑这个文件:
#!/usr/bin/env bash
cat > trial.txt <<EOL
|pattern|blabla|
|||4|||-0.97|0|1429037262.8271||20160229||1025||1000.0|0.01|,,
|pattern|blable|
|||5|||-1.27|0|1429037262.854||20160229||1025||1000.0|0.01|,,
|pattern|blasbla|
|||493|||-0.22|5|1429037262.8676||20170228||1025||1000.0|0.01|,,
|||11|||-0.22|5|1429037262.8676||20170228||1025||1000.0|0.01|,|T|347||1429043438.1962|-0.22|5|0||-0.22|1429043438.1962|,|Q|346||1429043437.713|-0.24|26|-0.22|5|||1429043437.713|
|pattern|jksds|
|||232|||-5.66|0|1429037262.817||20150415||1025||1000.0|0.01|,,
|pattern|bdjkds|
|||123q|||-7.15|0|1429037262.8271||20150415||1025||1000.0|0.01|,,
|pattern|blabla|
|||239ps|||-1.38|79086|1429037262.8773||20150415||1025||1000.0|0.01|,,
|||-92opa|||-1.38|79086|1429037262.8773||20150415||1025||1000.0|0.01|,|T|1||1428969600.5019|-0.99|1|11||||,
|||kj2w|||-1.38|79086|1429037262.8773||20150415||1025||1000.0|0.01|,|T|2||1428969600.5019|-1|1|11||||,
|||0293|||-1.38|79086|1429037262.8773||20150415||1025||1000.0|0.01|,|T|3||1428969600.5019|-1.01|1|11||||,
|||2;;w32|||-1.38|79086|1429037262.8773||20150415||1025||1000.0|0.01|,|T|4||1428969600.5019|-1.11|1|11||||,
EOL
【问题讨论】:
-
所以你的意思是用
|pattern|still some other different data替换第3行还是你可以删除第1行和第2行吗?如果合适,请更新您的 Q。祝你好运。 -
@shellter:“删除模式的前两行”这句话在原始问题中。我已经强调了它。 !您只需要删除第 1 行和第 2 行!。为什么好运?这是一件复杂的事情吗?
-
'删除模式的前两行'似乎不那么模棱两可了。我签署了我所有的 cmets 祝你好运。即使是这个,祝你好运;-)!
-
为什么投反对票?!
-
所示示例以三行模式开头,最后一个是
|pattern|sdk;sd|。所以我希望在输出中,但不是吗?现在,该行本身开始另一个模式,以您在所需输出中实际显示的内容结束。什么给了?