簡體   English   中英

如何使用linux命令用直線上偶數位置的點替換空格

[英]How to replace spaces with points at even positions in a line using linux command

我有一個文件,試圖將偶數位置的間距替換為兩點。 我可以使用什么linux命令來執行此操作?

我嘗試了以下sed命令sed 's/\\s/:/2'文本文件的每一行中替換字符串的第n次出現,但是它僅替換了第二次出現。


輸入

TEDL15_TRAINING_00018 2 0.047883321 6 0.041573718 7 0.020443868 8 0.035350464 11 0.026124746 16 0.035317142 22 0.014992127

TEDL15_TRAINING_00015 2 0.076135024 66 0.036367059 68 0.05614619 106 0.040146504 113 0.038728137 

輸出

TEDL15_TRAINING_00018 2:0.047883321 6:0.041573718 7:0.020443868 8 0.035350464 11:0.026124746 16:0.035317142 22:0.014992127

TEDL15_TRAINING_00015 2:0.076135024 66:0.036367059 68:0.05614619 106: 0.040146504 113:0.038728137 

假設您的文本存儲在名為test.txt的文件中:

sed -e 's/ \([[:digit:]]\+\) \([[:digit:]].[[:digit:]]\+\)/ \1:\2/g' test.txt

說明:

基本上,您的輸入數字采用以下格式(其中_代表空格):

_digit+_digit.digit+ 

因此,上面只是尋找此模式,捕獲其組並通過插入“:”來重寫它們

有一種awk方法,但在這種情況下我不確定這是最佳選擇:

awk '{for (i=1;i<=NF;i+=2)
     if (i==NF) {
       printf ("%s %s\n",$i,$(i+1))
       }
      else
       {
       printf ("%s %s:",$i,$(i+1))
       }
     }'

看起來有點丑陋,但適用於您的情況。

在這種情況下,perl是更易讀的選項。

sed 's/\([^[:space:]]\+[[:space:]]\+[^[:space:]]\+\)[[:space:]]\+/\1:/g'
awk '{for (i=1; i<=NF; i+=2) printf "%s%s %s", (i==1 ? "" : ":"), $i, $(i+1); print ""}'
perl -pe 's/(\S+\s+\S+)\s+/$1:/g'

使用不帶搜索模式相同部分的sed的行為和g選項

sed 's/^/- /;s/$/ /;s/\([^[:blank:]]\{1,\}\)[[:blank:]]\{1,\}\([^[:blank:]]\{1,\}[[:blank:]]\)/\1|\2/g;s/..//;s/.$//' YourFile

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

sed -r 's/(\s\S+)\s/\1:/g' file

這將在整個行中替換一個空格,然后是一個或多個非空格,然后是空格,然后是空格,再是一個或多個非空格,然后是冒號。

暫無
暫無

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

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