用最后一个特殊字符替换子字符串,即逗号分隔字符串的(第三部分)

用最后一个特殊字符替换子字符串,即逗号分隔字符串的(第三部分)

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

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

如您所见,第三个逗号分隔值有时会在末尾带有特殊字符,如破折号 (-)。我想使用 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 的第 3 个逗号分隔值的文件,因此最终会检查这些精确的字符串值 ($mystr) 中是否存在特殊字符,如下划线、破折号、点、双下划线,如果存在则删除它们并形成新字符串 ($myNEWstr),最后在 myFinalFile.txt 中替换该新字符串 ($myNEWstr),以便得到与上面示例最终字符串类似的结果字符串,即,使用第 3 个逗号分隔的子字符串值,而末尾没有特殊字符(上面示例中为破折号 (-))。

经过调查和大量测试后,我得出的结论是,问题在于在这种情况下由于某种原因,$mystr 无法被解析以进行替换,因为例如,它在文件中现有字符串的末尾有一个特殊字符(在上面的例子中是破折号 (-))!!

因此,我迫切地想找到一种方法来替换末尾带有特殊字符的字符串,使用文件和相关字符串行中末尾不带有特殊字符的相同字符串,在完全相同的位置,即字符串行的第 3 个逗号分隔值。

谢谢。

答案1

这个 perl 单行命令可以完成这个工作:

perl -ape 's/^(?:[^,]+,){2}[^,]+\K-(?=,)//;' inputfile > outputfile

或者,如果您想就地替换:

perl -i.backup -ape 's/^(?:[^,]+,){2}[^,]+\K-(?=,)//;' file

解释:

s/          # substitute
  ^             # beginning of line
    (?:         # non capture group
      [^,]+     # 1 or more non comma
      ,         # a comma
    ){2}        # end group, must appear twice
    [^,]+?      # 1 or more non comma
    \K          # forget all we have seen until this position
    -           # an hyphen
    (?=,)       # positive lookahead, make sure we have a comma after
//          # with nothing

相关内容