Awk sed:按照不同的模式剪切一个子字符串

Awk sed:按照不同的模式剪切一个子字符串,awk,sed,Awk,Sed,有一个我要修改的标识符列表: 3300000526.a:P_A23_Liq_2_FmtDRAFT_1000944_2, 200254578.a:CR_10_Liq_3_inCRDRAFT_100545_11, 3300000110.a:BSg2DRAFT_c10006505_1, 3300000062.a:IMNBL1DRAFT_c0010786_1, 3300000558.a:Draft_10335283_1 我想从第一个开始删除所有。草稿后第一个不区分大小写,即: 3300000526

有一个我要修改的标识符列表:

3300000526.a:P_A23_Liq_2_FmtDRAFT_1000944_2,
200254578.a:CR_10_Liq_3_inCRDRAFT_100545_11, 
3300000110.a:BSg2DRAFT_c10006505_1,
3300000062.a:IMNBL1DRAFT_c0010786_1,
3300000558.a:Draft_10335283_1 
我想从第一个开始删除所有。草稿后第一个不区分大小写,即:

3300000526_1000944_2,
200254578_100545_11, 
3300000110_c10006505_1,
3300000062_c0010786_1,
3300000558_10335283_1 
我使用的是sed的s/.a.*[a-zA-Z0-9]草稿.*.[^.].[a-zA-Z0-9]//g',但它忽略草稿后的第一个.[u],并执行以下操作:

3300000526_2,
200254578_11, 
3300000110_1,
3300000062_1,
3300000558_1 
附言。 可以有各种标识符,我试图在这里显示它们的差异的一小部分,但它们都保持相同的模式


如果你能改正,我将不胜感激

您可以在awk中轻松完成此操作,请尝试以下操作一次。仅基于显示的样本

awk -F'[.]|DRAFT_' '{$2="_";sub(/ +_ +/,"_")} 1' Input_file
或使用GNU awk处理不区分大小写的问题,请尝试:

awk -v IGNORECASE="1" -F'[.]|DRAFT_' '{$2="_";sub(/ +_ +/,"_")} 1' Input_file
要在不使用ignorecase选项的情况下处理不区分大小写,请尝试:

awk -F'[.]|[dD][rR][aA][fF][tT]_' '{$2="_";sub(/ +_ +/,"_")} 1' Input_file
说明:只需将字段分隔符设置为。或根据OP的需要起草。然后在主程序中将第二个字段设置为u,然后将空格替换为下划线空格。最后按1打印当前行。

可行的解决方案 您可以使用:

sed 's/[.].*[dD][rR][aA][fF][tT]_/_/' data
您也可以使用\。但是我对不必要的反斜杠过敏——如果你不得不花时间争论8个或16个连续的反斜杠是否是使用troff写入文档标记的正确方法,你可能也会过敏

对于示例数据,它将生成:

3300000526_1000944_2,
200254578_100545_11, 
3300000110_c10006505_1,
3300000062_c0010786_1,
3300000558_10335283_1 
出了什么问题 你的命令是:

sed 's/.a.*[a-zA-Z0-9]DRAFT_.*[^_]_[a-zA-Z0-9]//g'
这符合:

任何主角。 小写字母“a” 任何字符序列 字母数字字符 仅大写草稿 强调 任何字符序列 强调 字母数字字符 在每条线上进行全局匹配 然后删除所有匹配的材质。您可以使用以下方法拯救它:

sed 's/[.]a.*[a-zA-Z0-9]DRAFT\(_.*[^_]_[a-zA-Z0-9]\)/\1/'
这将匹配一个点而不是任何字符,并在草稿后保存材料,以下划线开始,即\…\,将匹配的内容替换为保存的内容,即\1。当然,您也可以将DRAFT转换为不区分大小写的模式。然而,问题的术语是从第一点开始的。不区分大小写的草稿后最多包含下划线,并且不需要在下划线后详细说明、保存和替换材质

懒惰 我使用了一个名为mkpattern的程序来避免自己输入复杂的不区分大小写的字符串,这个程序是根据我在1990-08-23上创建的RCS编写的。这不是火箭科学。我经常使用它——事实上,在过去的一周里,我已经多次使用它,在工作中的系统上搜索一些难以捉摸的文档

$ mkpattern DRAFT
[dD][rR][aA][fF][tT]
$
你以后可能得亲自动手。

试试类似的方法

{mawk/mawk2/gawk} 'BEGIN { FS = "[\056].+DRAFT_"; OFS = ""; } (NF < 2) || ($1 = $1)' 

它可能不是最快的,但它是相对干净的方法。octal\056是句点,当下一个项目是a时,它对读者来说就不那么模棱两可了。+

这可能适用于GNU-sed:

sed -nE 's/DRAFT[^_]*/\n/i;s/\..*\n//p' file
首先打开-n和-E以关闭隐式打印并使regexp更易于查看

因为我们想要草稿的第一次出现,所以不能使用使用.*习惯用法的regexp,因为这是贪婪的,如果出现两次或更多这样的情况,可能会忽略它。因此,我们用行中无法出现的唯一字符替换草稿。换行只能由程序员引入,是最好的选择

现在我们可以使用.*习惯用法,因为只有在前面的替换成功匹配的情况下,引入的换行符才能存在


注意:第一次替换中的i标志允许字符串草稿的任何大写/小写格式副本,第二次替换也包括打印成功替换的p标志。

应该注意的是,如果右侧还有其他模式,引入。*模式也会引入回溯。由于回溯工作是向后的,这也意味着如果有两个或更多可能的模式匹配,第二个模式将首先匹配。OP没有明确说明匹配,但这两种方法会产生不同的结果,即,如果OP希望第一个模式匹配,则此方法不会适用于所有情况。