bashを使用して文字列を同じ長さの2つの部分文字列に分割する方法は?


12

文字列を2つに分割し、順番に印刷したいと思います。例えば:

abcdef

abc
def

それを行う簡単な方法はありますか、それとも文字列処理が必要ですか?


着信文字列はどのように取得しますか?変数?Stdin?その他?
ジェフシャラー

1
変数内。何でも解決できるため(stdinの入力を変数に入れることができるので)、実際には問題ではありません。
ガブリエルディエゴ

特に大きな可能性がある場合は、効率が重要です。また、便宜上。
ピーター

回答:


16

パラメーター展開シェル演算を使用します

変数の前半は次のようになります。

${var:0:${#var}/2}

変数の後半は次のようになります。

${var:${#var}/2}

以下を使用できます。

printf '%s\n' "${var:0:${#var}/2}" "${var:${#var}/2}"

次のawkコマンドも使用できます。

awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'

$ echo abcdef | awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'
abc
def

回答ありがとうございます!
ガブリエルディエゴ

簡潔でエレガントなソリューション。
デューディボーイ

3
を取り除くことができます$((...))。部分置換は、すでに算術式として評価されています。例:。それは文書化されており、bash と同じです。offlen${var:off:len}foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}"zshksh93
mosvy

3
注:文字列の長さが奇数の場合、これはそれを2つの部分に分割しますが、2番目の文字はより長い文字になります。
peterh -復活モニカ

8

を使用してsplit、ここで文字列とコマンド置換:

var=abcdef
printf '%s\n' "$(split -n1/2 <<<$var)" "$(split -n2/2 <<<$var)"

7

別のawkスクリプトは次のとおりです。

echo abcdef | awk '{print substr($0,1,length/2); print substr($0,length/2+1)}'

1
除算//ERE/演算子の構文のあいまいさ、および()オプションの特殊なケースの ために、mawkまたはbusybox awkでは動作しないことに注意してくださいlength(これらの実装は、まだPOSIXに準拠していません)。代わりにlength()またはを使用すると、それらに役立ちます。また、文字列に改行文字が含まれている場合でも、パイプと余分なプロセスを保存し、それを機能させることができます。length($0)lengthawk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdef
ステファンシャゼラス

1

Python 3

s = input()  # Take one line of input from stdin.
x = len(s) // 2  # Get middle of string. "//" is floor division
print(s[:x], s[x:], sep="\n")  # Print "s" up to "x", then "s" past "x", joined on newlines.

例えば、

$ echo abcdef | python3 -c 's = input(); x = len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
def

文字列の長さが偶数でない場合、2行目は長くなります。例えば

$ echo abcdefg | python3 -c 's = input(); x= len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
defg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.