[英](GNU)Sed: how to replace any character from nth character to nth+10?
我需要在字符串中替換第10到第20個字符,如下所示:
123456789012345678901234567890
到目前為止,我已經嘗試過:
一個)
僅適用於第10個角色: echo "123456789012345678901234567890" | sed 's/./X/10'
echo "123456789012345678901234567890" | sed 's/./X/10'
b)不適用於該范圍:
echo "123456789012345678901234567890" | sed 's/./X/10,20'
echo "123456789012345678901234567890" | sed 's/./X/10\,20'
echo "123456789012345678901234567890" | sed 's/./X/\{10,20\}'
echo "123456789012345678901234567890" | sed 's/./X/\{10\,20\}'
不起作用,我得到錯誤
's'的未知選項
所以 - 問題是 - 我該如何使它工作:
echo "123456789012345678901234567890" | sed 's/./X/10,20'
嘗試:
$ sed -r "s/^(.{9})(.{11})/\1XXXXXXXXXX/" <<< 123456789012345678901234567890
123456789XXXXXXXXXX1234567890
這是一個復雜的sed
問題,我可以找到這個解決方案:
$ sed 's/^\(.\{10\}\)\(.\{10\}\)/\1XXXXXXXXXX/' <<< 123456789012345678901234567890
1234567890XXXXXXXXXX1234567890
使用awk
它看起來更好:
$ awk 'BEGIN{FS=OFS=""} {for (i=10;i<=20;i++) $i="X"} {print}' <<< 123456789012345678901234567890
123456789XXXXXXXXXXX1234567890
您可以使用bash參數替換來執行此操作,如下所示:
#!/bin/bash
s="123456789012345678901234567890"
l=${s:0:9} # Extract left part
m=${s:10:11} # Extract middle part
r=${s:20} # Extract right part
# Diddle with middle part to your heart's content and re-assemble "$l$m$r" when done
m=$(sed 's/./X/g' <<<$m)
有關更多說明和示例,請參見此處 。
或者,你可以這樣做:
如下面的單行中所示:
$ echo "123456789012345678901234567890" | sed "s/\(.\)/\1\n/g" | sed "10,20s/./X/" | tr -d "\n"
我知道,它看起來很難看,但是:
echo "123456789012345678901234567890" | \
sed 's/^\(.\{10\}\).\{10\}\(.*\)/\1XXXXXXXXXX\2/'
不在sed命令中放置多個X:
sed -r 's/^(.{9})(.{10,20})(.*)$/\1\n\2\n\3/' | sed -e '2s/./X/g' -e 'N;N;s/\n//g'
要替換第10個到第20個字符(包括第10個字符),請嘗試:
echo 123456789012345678901234567890 | sed 's/\(.\{9\}\).\{11\}/\1XXXXXXXXXX/'
123456789XXXXXXXXXX1234567890
使用GNU sed,您可以使用-r
開關刪除大多數反斜杠:
echo 123456789012345678901234567890 | sed -r 's/(.{9}).{11}/\1XXXXXXXXXX/'
或者天真的方法也適用於此:
echo 123456789012345678901234567890 | sed 's/\(.........\).........../\1XXXXXXXXXX/'
這可能適合你(GNU sed):
sed ':a;/.\{9\}X\{11\}/!s/\(.\{9\}X*\)./\1X/;ta' file
或者用一點句法糖:
sed -r ':a;/.{9}X{11}/!s/(.{9}X*)./\1X/;ta' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.