GNU/Linux >> Znalost Linux >  >> Linux

Nahraďte všechny znaky kromě prvních čtyř znaků

S GNU Sed,

md5sum input.txt | sed 's/./x/5g'

Tím jednoduše přeskočíte nahrazení prvních 4 znaků řetězce a provedete nahrazení všech ostatních znaků.

Alternativa POSIX s Awk (i když pravděpodobně existuje něco jednoduššího),

md5sum xad | awk '{
  four=substr($0, 1, 4)
  rest=substr($0, 5)
  gsub(/./, "x", rest)
  print four, rest
}' OFS=""

POSIXly (myslím), že byste mohli použít sed loop k opakovanému nahrazení prvního non-x znak následující za předponou o 4 znacích:

$ md5sum input.txt | sed '
:a
s/^\(....x*\)[^x]/\1x/
ta
'

Nahraďte [^x] s [^x ] pokud chcete provést substituci pouze v prvním poli (kontrolní součet).


S perl pokud GNU sed není k dispozici:

md5sum input.txt | perl -pe 's/^.{4}(*SKIP)(*F)|./x/g'

^.{4}(*SKIP)(*F) zabrání nahrazení prvních čtyř znaků

|. určuje alternativní vzor, ​​který má být nahrazen


Chcete-li změnit pouze kontrolní součet:

md5sum ip.txt | perl -pe 's/(^.{4}|\h.*$)(*SKIP)(*F)|./x/g'

Pokud md5sum výstup začíná \ (např. pokud název souboru obsahuje znak nového řádku), můžete použít ^\\?.{4} místo ^.{4} aby bylo prvních pět znaků ponecháno odmaskovaných.


Linux
  1. Sed:Smazat všechny výskyty řetězce kromě prvního?

  2. Jak nahradit jeden znak druhým ve všech názvech souborů aktuálních adresářů?

  3. Může Sed nahradit nové řádkové znaky?

  1. Zobrazit všechny soubory až do shody?

  2. Pokud ^a^b nahradí „a“ jednou v posledním příkazu, co mám použít k nahrazení všech výskytů „a“?

  3. Jak je zástupný znak * interpretován jako příkaz?

  1. První, který se vysílal úplně na Linuxu

  2. Smažte všechny soubory kromě nejnovějších 3 v bash skriptu

  3. Zabít všechny instance Chrome na příkazovém řádku?