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

问题描述 投票:0回答:2

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

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的第三个逗号分隔值的文件,因此最后将检查那些精确的字符串值($ mystr)以查找特殊字符,例如下划线,破折号,点,双下划线,如果要删除它们并形成新字符串($ myNEWstr),则最后在myFinalFile.txt处替换该新字符串($ myNEWstr),以使生成的字符串类似于示例最后显示的字符串,即第三个逗号分隔的子字符串值,最后没有特殊字符(在上面的示例中为破折号(-))。

谢谢。

string perl sed replace hp-ux
2个回答
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,,,
]$

0
投票

您为什么不使用awk?喜欢:

awk 'BEGIN{FS=OFS=","} {sub(/-$/,"",$3)} 1' file
© www.soinside.com 2019 - 2024. All rights reserved.