Sed

sed中,如何在字元串中的字元之間放置一個“&”?

  • August 26, 2017

可以sed做類似的東西:

12345

變得 :

1&2&3&4&5

?

使用 GNU sed

sed 's/./\&&/2g'

(用( ) 前面的相同 ( )s替換每個 ( g) 字元 ( ),但僅從第二次出現 ( ) 開始)。.``&``&``\&``2

便攜:

sed 's/./\&&/g;s/&//'

(替換每一個出現,但然後刪除&我們不想要的第一個)。

使用一些awk實現(不是 POSIX,因為對於空 FS 的行為未指定):

awk -F '' -v OFS="&" '{$1=$1;print}'

(在gawk其他一些awk實現中,空欄位分隔符將記錄拆分為其字元組成部分輸出欄位分隔符( OFS) 設置為&。我們為(本身)分配一個值$1以強制使用新的欄位分隔符重新生成記錄在列印它之前,它NF=NF也可以工作,並且在許多 awk 實現中效率更高,但是當你這樣做時的行為目前沒有被 POSIX 指定)。

perl:

perl -F -lape '$_=join"&",@F' 

(-pe為每一行執行程式碼,並列印結果 ( $_);-l自動去除並重新添加行尾;在 中設置的分隔符上-a填充@F輸入拆分-F,這裡是一個空字元串。結果是將每個字元拆分為@F,然後用 ‘&’ 將它們連接起來,並列印該行。)

或者:

perl -pe 's/(?<=.)./&$&/g' 

(替換每個字元,前提是它前面有另一個字元(後視正則表達式運算符 (?<=…))

使用zsh外殼運算符:

in=12345
out=${(j:&:)${(s::)in}}

(再次,使用參數擴展標誌在空欄位分隔符上拆分s::,並加入&

或者:

out=${in///&} out=${out#?}

&(使用ksh 運算符替換每次出現的任何內容(因此在每個字元之前)${var//pattern/replacement}(儘管在ksh空模式中意味著其他內容,但還有其他內容,我不確定 in 是什麼),並使用 POSIX剝離bash刪除第一個${var#pattern}操作員)。

使用ksh93外殼運算符:

in=12345
out=${in//~(P:.(?=.))/\0&}

~(P:perl-like-RE)作為 ksh93 glob 運算符,使用類似 perl 的正則表達式(儘管與 perl 或 PCRE 不同),(?=.)作為前瞻運算符:替換一個字元,前提是它後面是另一個字元本身(\0)和&

或者:

out=${in//?/&\0}; out=${out#?}

(將每個字元 ( ?)替換為&和本身 ( \0),我們刪除了多餘的字元)

使用bash外殼運算符:

shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}

(與zsh’s 相同,不同之處在於您需要@()在那裡(您需要的 ksh glob 運算符extglobbash)。

引用自:https://unix.stackexchange.com/questions/388165