Linux で予想されるサブグループの代わりに、Sed 置換グループが OSX に追加されます。

Linux で予想されるサブグループの代わりに、Sed 置換グループが OSX に追加されます。

カンマで区切られた3つの列があります。姓、名前、社会的な名前。

姓の列のすべての文字を大文字に置き換えようとしています。

sed 's/\([^,]*\)/\U\1/' foo.file

osxでは、このコマンドは、大文字の文字列を開始するのではなく、各行の先頭に大文字のUを追加しますが、Ubuntuインスタンスでは期待どおりに機能します。

なぜこれが起こるのかわかりません。

マニュアルページには、「マルチバイト文字は ''s'' および ''y'' コマンドの区切り文字としては使用できません。区切り文字を「i」に置き換えると同じことが発生するため、問題になりません。

答え1

sed 'h;s/[^,]*,[^,]*,//
     y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
     H;x;s/[^,]*\n//

' foo.file

答え2

\U実際にBSDismに触発されたGNUismです。これはエディタsの対応するコマンドex(コマンドラインモードvi)からのものです。

OS/X は、AT&T の著作権問題の後、最初から書き直されたsed4.4BSD から派生した FreeBSD から派生した可能性が高いです。sedいずれにせよ、BSDやAT&Tは彼らの注文をsedサポートしていません。\Us

ポータブルで大文字に変換するには、sed通常y次のコマンドを使用します。すでに示されているように

ただし、ここではより良いアプローチを使用できますawk

awk -F, -vOFS=, '{$1 = toupper($1); print}'

答え3

簡単な作業には必要ありません。sed

while IFS=',' read -r first mid last
do
    echo "$first, $mid, ${last^^}"
done < file_with_commas

バージョンが変数拡張をサポートしていない場合は、bash次のものを使用できます。tr

last=$(echo $last | tr [[:lower:]] [[:upper:]])

答え4

/U と /L が OSX/BSD sed では動作しないようです。

とともに

sed /pattern/,+2d # like `sed '/pattern/{N;N;d;}'`
sed -n 0~3p # like `awk NR%3==0`
sed /pattern/Q # like `awk '/pattern/{exit}1'` or `sed -n '/pattern/,$!p'`
sed 's/\b./\u&/g' # \u converts the next character to uppercase
sed 's/^./\l&/' # \l converts the next character to lowercase
sed -i '1ecat file_to_prepend' file # e executes a shell command
sed -n l0 # 0 disables wrapping

ありがとうございます。私の評判は投票するほど高くはありませんが、Mikeはsedを使って私の問題を解決し、私もStephaneのコメントに同意します。 awkがより良い選択のようです。

関連情報