【问题标题】:replace sub-string with last special character, being (3rd part) of comma separated string用最后一个特殊字符替换子字符串,是逗号分隔字符串的(第三部分)
【发布时间】:2020-02-24 04:08:08
【问题描述】:

我有一个逗号分隔值的字符串,例如:

742108,SOME-STRING_A_-BLAHBLAH_1-4MP0RTTYE,SOME-STRING_A_-BLAHBLAH_1-4MP0-,,,

如您所见,第 3 个逗号分隔值最后有时会包含特殊字符,例如破折号 (-)。我想使用 sed,或者最好是 perl 命令来替换这个字符串(使用 -i 选项,以便在现有文件中替换),在同一个地方使用相同的字符串(即第三个逗号分隔值)但没有特殊字符(就像字符串末尾的破折号 (-))。因此,上面示例字符串的结果应该是:

742108,SOME-STRING_A_-BLAHBLAH_1-4MP0RTTYE,SOME-STRING_A_-BLAHBLAH_1-4MP0,,,

由于像上面这样的多行在一个文件中,我在 shell/bash 脚本中使用 while 循环来循环和操作文件的所有行。并且我已经将上述字符串值分配给变量,以便使用 perl 替换它们。所以,我的while循环是:

while read mystr
do
myNEWstr=$(echo $mystr | sed s/[_.-]$// | sed s/[__]$// | sed s/[_.-]$//)
perl -pi -e "s/\b$mystr\b/$myNEWstr/g" myFinalFile.txt
done < myInputFile.txt

地点:

$mystr is the "SOME-STRING_A_-BLAHBLAH_1-4MP0-"
$myNEWstr result is the "SOME-STRING_A_-BLAHBLAH_1-4MP0"

请注意,myInputFile.txt 是一个文件,其中包含 myFinalFile.txt 的第三个逗号分隔值,因此最后会检查那些 EXACT 字符串值 ($mystr) 是否有特殊字符,例如下划线、破折号、点,双下划线,如果它们存在要删除并形成新字符串($myNEWstr),那么最后在 myFinalFile.txt 中替换新字符串($myNEWstr),这样得到的字符串就像上面显示的示例最终字符串,即第三个逗号分隔的子字符串值末尾没有特殊字符(在上面的示例中为破折号 (-))。

谢谢。

【问题讨论】:

    标签: string perl sed replace hp-ux


    【解决方案1】:

    您可以使用以下正则表达式:

    s/^([^,]*,[^,]*,[^,]*)-,/$1,/
    

    这将 csv 字段定义为逗号以外的一系列字符(允许空字段)。我们正在第三个 csv 字段的最后寻找一个破折号。正则表达式捕获直到那里的所有内容,然后在省略破折号的同时替换它。

    $ cat t.txt
    742108,SOME-STRING_A_-BLAHBLAH_1-4MP0RTTYE,SOME-STRING_A_-BLAHBLAH_1-4MP0-,,,
    ]$ perl -p -e 's/^([^,]*,[^,]*,[^,]*)-,/$1,/' t.txt
    742108,SOME-STRING_A_-BLAHBLAH_1-4MP0RTTYE,SOME-STRING_A_-BLAHBLAH_1-4MP0,,,
    ]$
    

    【讨论】:

    • 可以对我一起提到的所有特殊字符执行此操作,而不仅仅是破折号,这意味着以下所有内容:下划线、破折号、点、双下划线?此外,我想每次都只替换 EXACT 字符串。但是使用 perl,至少对于我的版本(为 IA64.ARCHREV_0-thread-multi 构建的 v5.8.3),我可以理解替换字符串末尾包含破折号(或其他特殊字符)的字符串存在问题,它只是什么都不做,即没有用新字符串替换这个字符串。
    • @Kostas:好吧,您可以使用字符类(用括号括起来)来扩展停止字符列表,例如s/^([^,]*,[^,]*,[^,]*)[_-.],/$1,/(下划线、破折号、点)。
    猜你喜欢
    • 2013-09-20
    • 2022-12-01
    • 1970-01-01
    • 2011-05-18
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多