Shell脚本,使用sed替换字符

时间:2013-09-06 07:21:14

标签: shell sed

在shell脚本中,我想用sed替换1bc1034gf45dna22(总共16个字符)和1b:c1:03:4g:f4:5d:na:22(用冒号分隔)。

修改

我试过了

sed 's/\w{2}/\w{2}:/g' a.txt > b.txt

其中a.txt

1bc1034gf45dna22

7 个答案:

答案 0 :(得分:2)

边缘情况太多

Sed不是这项工作的理想工具,因为边缘情况太多了。如果您有非常规则的数据和已知的语料库那么这很好,但在某些情况下,您需要一些功能更强大的功能,可以在匹配/捕获感兴趣的文本后独立地对行的起作用。例如,给定一个包含以下内容的输入文件:

foo 1bc1034gf45dna22 bar

您可能需要提取第二列,对其进行转换,然后将其替换为原位。您可以使用Ruby执行此操作,如下所示:

$ echo 'foo 1bc1034gf45dna22 bar' |
ruby -pe '
  if /(?<str>\p{Alnum}{16})/ =~ $_
    $_.sub!(str, str.scan(/../).join(?:))
  end'

这正确地产生:

foo 1b:c1:03:4g:f4:5d:na:22 bar

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed 's/\w\w\B/&:/g' file

答案 2 :(得分:1)

确实

sed -e 's/../&:/g' -e 's/:$//' a.txt > b.txt

sed -e 's/\(..\)/\1:/g' -e 's/:$//' a.txt > b.txt

为你工作?

答案 3 :(得分:0)

为什么不sed 's/1bc1034gf45dna22/1b:c1:03:4g:f4:5d:na:2/g' file

答案 4 :(得分:0)

在任何GNU / Linux发行版上使用GNU / sed,您可以使用扩展的正则表达式。这会将任意长度的字符串转换为字符串,其中每两个字母用冒号分隔:

echo 1bc1034gf45dna22 | sed -re 's/(\w{2})/\1:/g' -e 's/:$//'

在AIX平台上,您可以利用awk:

echo 1bc1034gf45dna22 | awk '
  BEGIN { FS=""; ORS=""; } 
  {
    for (i=1; i <=NF; i++) {
      if (i > 1 && (i + 1) % 2 == 0) { 
        print(":"); 
      }  

      print($i);
    }
  }'

答案 5 :(得分:0)

你可以:

sed -i 's/\(\w\{2\}\)/\1:/g' file

这也会在字符串的末尾附加一个:由于我们不能在sed regex语法中使用正向前瞻,因此我们需要:

sed -i 's/:$//g' file

请注意,我们对sed使用了内部编辑,因此文件将以这种方式更改。

或者,您可以使用perl来使用/(\ w {2})(?= \ w {2})/ $ 1:/ g

的正则表达式

答案 6 :(得分:0)

嗯,总有蛮力方法:

sed 's/\<'\
'\([0-9a-z][0-9a-z]\)'\
'\([0-9a-z][0-9a-z]\)'\
'\([0-9a-z][0-9a-z]\)'\
'\([0-9a-z][0-9a-z]\)'\
'\([0-9a-z][0-9a-z]\)'\
'\([0-9a-z][0-9a-z]\)'\
'\([0-9a-z][0-9a-z]\)'\
'\([0-9a-z][0-9a-z]\)'\
'\>/\1:\2:\3:\4:\5:\6:\7:\8/g'

在延续线上没有前导空格,外壳正确地将字符串粘贴在一起。

相关问题