[英]How to replace '/' with '/\' using sed in shell scripting
[英]Shell scripting, replace the characters using sed
在shell腳本中,我想使用1bc1034gf45dna22
將1bc1034gf45dna22
(總共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.