web-dev-qa-db-ja.com

スペースの後に単一の文字を取得するにはどうすればよいですか?

どうすれば出力を下回ることができますか?最初のフィールドをそのままにして、スペースの後の1文字が必要です。

echo "Hello world"
Hellow

3番目のフィールドもある場合は、3番目のフィールドの最初の文字が出力に含まれている必要があります。

echo "hello world unix"
hellou
2
BDN

awkを使用して、最後の空白で区切られた単語の最初の文字と連結された最初の空白で区切られた単語を出力します。

_awk '{ print $1 substr($NF, 1, 1) }'
_

substr()関数は、文字列の指定された位置から文字数を返します。_$1_および_$NF_は、それぞれ現在の行の最初と最後の空白で区切られた単語です。

テスト:

_$ echo 'hello world' | awk '{ print $1 substr($NF, 1, 1) }'
hellow
_
_$ echo 'Apple beet carrot' | awk '{ print $1 substr($NF, 1, 1) }'
applec
_
4
Kusalananda

sedあり:

編集:glenn jackmann によって改善されました、ありがとう!

$ echo "Hello world" | sed -E 's/(\S+).*\s(\S).*$/\1\2/'
Hellow
$ echo "hello world unix" | sed -E 's/(\S+).*\s(\S).*$/\1\2/'
hellou

例として「helloworldunix」を使用した説明:

  • s/次のパターンに置き換えます
  • (\S+) 1番目のグループ、1つ以上の非スペース文字: "hello"
  • .*中央部分、任意の文字:「世界」
  • \sスペース文字: ""
  • (\S) 2番目のグループ、非スペース文字: "u"
  • .*$最後までの任意の文字: "nix"
  • /\1\2/ 1番目と2番目のグループに置き換えます: "hellou"

bashあり:

$ var="Hello world"
$ var_end=${var##* };echo ${var%% *}${var_end:0:1}
Hellow

$ var="hello world unix"
$ var_end=${var##* };echo ${var%% *}${var_end:0:1}
hellou

例として「helloworldunix」を使用した説明:

  • var_end=${var##* }一致するプレフィックスパターン、最長の一致を削除し、
    "hello world"、結果: "unix"
  • ${var%% *}一致するサフィックスパターン、最長の一致を削除し、
    "world unix"、結果: "hello"
  • ${var_end:0:1}最初の文字を取得: "u"
6
Freddy

Bashの使用:

text="hello world unix"
if [[ $text =~ ^([^[:space:]]+).*[[:space:]]([^[:space:]]) ]]; then
    declare -p BASH_REMATCH
    echo "${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
fi
declare -ar BASH_REMATCH='([0]="hello world u" [1]="hello" [2]="u")'
hellou
3
glenn jackman