簡體   English   中英

(GNU)Sed:如何將第n個字符中的任何字符替換為第n + 10個字符?

[英](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)

有關更多說明和示例,請參見此處

或者,你可以這樣做:

  1. 將字母行轉換為一列,使每一行都在自己的行上
  2. 將您的編輯應用於LINES 10到20(而不是字符10到20)
  3. 將字母列轉換回一行(通過刪除換行符)

如下面的單行中所示:

    $ 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.

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