在sed
中,如何在字元串中的字元之間放置一個“&”?
可以
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 運算符extglob
)bash
)。