GNUソリューションを見つけたようですが、BSDsed
ソリューションが必要です。
私がやりたいことは、一度に単語全体を変えることです。単語が「clayii」で、私のコードがsed 's/c/k/g;s/l/i/g;s/a/e/g;s/y/i/g;s/k/o/g'
「kieii」を生成すると予想していますが、明らかな理由で「oieiii」を生成します。最後の部分ではk
最初から検索して見つけますが、単語全体を検索する場合は絶対にそうしません。
明らかに「clayii」は常に異なるので、単一の文字を置き換えて再起動しないことを望んでいます。すでに最初の文字を置き換えてn
から最初に見つかった場合は、再起動しないでください。したがって、置き換えられたコンテンツは検出できる場合はデフォルトで無視されます。
解決策はありますか?
答え1
y//
代わりに(sedの組み込みtrコマンド)を使用することもできますs///
。
$ echo clayii | sed -e '/clayii/ y/clayk/kieio/'
kieiii
このy//
コマンドは、一致する単語だけでなく、行全体で動作し続けます。
答え2
BSD sedでは、次のことができます。
sed "s/[[:<:]]clayii[[:>:]]/kieii/g" /path/to/file
答え3
繰り返すことができます:
echo here is a pat and a tern and a pattern |
sed -e'1{H;x;s/\(.\).*/\1pattern\1replace/;x;}' \
-eG -e'/\(.*\)\(.*\n\)\(\n\1\)\n/!{P;d;}' \
-e's//\3\2/;t-' \
-e:- -e's/\(\n\)\(.\)\(.*\n\)\(.\)/\4\1\3/;t-' \
-e's/\n//;P;d'
here is a pat and a tern and a replace
これにより、文字が左から右に1文字ずつ置き換えられます。各置換について、最初の区切り文字を置き換える文字の右側に移動します。予想される置換をl
繰り返す前に ook コマンドを貼り付けると、t
どういう意味かがわかります-e:-
。
here is a pat and a tern and a \npattern\nreplace$
here is a pat and a tern and a r\nattern\neplace$
here is a pat and a tern and a re\nttern\nplace$
here is a pat and a tern and a rep\ntern\nlace$
here is a pat and a tern and a repl\nern\nace$
here is a pat and a tern and a repla\nrn\nce$
here is a pat and a tern and a replac\nn\ne$
here is a pat and a tern and a replace\n\n$
here is a pat and a tern and a replace
あなたが本当に何らかの翻訳の仕事を探しているなら、あなたもそうすることができます。私は以前に他の質問に答えて、次のように書きました。
うまくいくようです。一種の入居/退去作業を行うだけです。
echo can ccccc ccccccccclayii sed clay ignore \ every cclayii thing but the matching word\ - cclayiicclayii | sed -e'y/ /\n/' \ -eh -e's/\(cclayii\)\1*/ & /g;x;s// /g;s/^/ /' \ -ex -e's//./;s/\([^ ]* *\)\{2\}/\1 /g;s/^/ /' \ -e'y/clayk/kieio/;G;t$' -e:$ \ -e'/^ \n /{s///;y/ \n/\n /;}' \ -et -e's/^ *\([^ ]*\) \(.* \n [^ ]*\) /\2\1/;t$'
can ccccc ccccccckkieiii sed clay ignore every kkieiii thing but the matching word - kkieiiikkieiii
…しかし、簡単ではありません。
それも少し繰り返されますが、それほど多くはありません。
しかし、ほとんどの複雑な問題と同様に方法2つを使用すると
sed
簡単です。echo can ccccc ccccccccclayii sed clay ignore \ every cclayii thing but the matching word\ - cclayiicclayii | sed -e's/\(cclayii\)\1*/\n&\n /g;G;s/^/ /'| sed -e'/^ /!y/clayk/kieio/;/./{H;d;}' \ -e'x;s/\n \{0,1\}//g'
can ccccc ccccccckkieiii sed clay ignore every kkieiii thing but the matching word - kkieiiikkieiii
BSDの場合は、sed
右側の最初の置換でエスケープ文字の代わりにリテラル改行文字を使用する必要がありますn
。\n
sed