簡體   English   中英

Shell腳本,使用sed替換字符

[英]Shell scripting, replace the characters using sed

在shell腳本中,我想使用1bc1034gf45dna221bc1034gf45dna22 (總共16個字符)替換為1b:c1:03:4g:f4:5d:na:22 (由冒號分隔)。

編輯

我努力了

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

a.txt在哪里

1bc1034gf45dna22

邊緣案例過多

Sed並不是理想的工具,因為邊緣情況太多了。 如果你有非常常規數據和已知的語料庫那么這很好,但在某些情況下,你需要更強大的東西,可以匹配后獨立一行 ACT /捕獲感興趣的文本。 例如,給定一個包含以下內容的輸入文件:

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

這可能對您有用(GNU sed):

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

是否

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

要么

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

為你工作?

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

在任何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);
    }
  }'

你可以:

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

這還將在字符串的末尾附加一個:。 由於我們不能在sed regex語法中使用正向超前,因此我們需要:

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

請注意,我們對sed使用了就地編輯,因此文件將以這種方式更改。

或者,您可以使用perl來使用原本為/(\\ w {2})(?= \\ w {2})/ $ 1:/ g的正則表達式

好吧,總有蠻力方法:

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'

連續線上沒有前導空格,外殼將字符串正確粘貼在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM