如何使用awk或sed从文件中删除特定的垃圾值模式?

时间:2016-10-18 05:48:54

标签: awk gsub

我的xml文件中有两种类型的模式,我想删除它而不会打扰任何其他有意义的模式。

testname="@TEST-Loop${c}- 05030502956 @TEST - verify that the  Handler returns an error indicating â~@~\call barredâ~@~]." enabled="true">

我想将其更改为

testname="@TEST-Loop${c}- 05030502956 @TEST - verify that the  Handler returns an error indicating call barred." enabled="true">

我尝试了下面的代码,但它没有用

awk '{if(match($0,/@TEST.*" enabled="true">$/))
 gsub(/â~@~\\/,"");
 gsub(/â~@~\]/,"");
  print}' $file >> tmp.jmx && mv tmp.jmx $file

1 个答案:

答案 0 :(得分:0)

您尝试替换的模式看起来像是在一些传统的8位编码中查看的受损的UTF-8字符。因为您没有指定是哪种编码,所以我们必须做大量的猜测。

你问的是Unix工具,所以这个答案假设你使用了一些U * x衍生物或者可以访问本地盒子上的类似工具(Cygwin?)

要查找要替换的字符串中的实际字节,可以执行类似

的操作
bash$ grep -o '...~@~...' -m1 "$file" |
> od -Ax -tx1o1
0000000    67  20  e2  7e  40  7e  5c  63  61  0a                        
          147 040 342 176 100 176 134 143 141 012                        
000000a

我将od用于portability reasons;您可能更喜欢hexdumpxxd或其他工具。输出包括十六进制和八进制,如octal is preferred in Awk,但十六进制在编程中无处不在。我在匹配项中保留了几个上下文字符,以防â实际上存储在您的示例中的多字节编码中,但是在这个有点推测的示例中,事实证明它由单个字节表示0xE2(八进制342)。 (这将identify your terminal encoding作为Latin-1或一些近亲;可能是CP125x Windows编码之一。)

有了这些信息,我们可以继续

awk '{ gsub(/\342~@~./, "") }1' "$file"

替换讨厌的字符序列,或者

sed $'s/\xe2~@~.//' "$file"

假设您的shell是Bash或一些接近兼容的,允许您使用C风格的字符串$'...' - 或者,如果您知道您的sed方言支持不可打印字符的特定表示法,你可以使用它,但那便携性更差。

(如果您的sed支持-i选项,或者您的Awk支持--inline,则可以就地替换该文件,即让脚本将文件替换为修改后的版本无需重定向或临时文件。再次,这具有可移植性问题。)

我想强调我们无法猜测您的编码所以您的问题应该理想地包含此信息。请参阅Stack Overflow character-encoding tag wiki以获取有关此类问题中包含的内容的指导。

相关问题