次の行があります。
postgres 3625 1 0 Jan31 ? 00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data
最初の5文字と最後の10文字を切り取り、1行につなげるように指示します。
答え1
ここで何をしたいのかよくわかりませんが、
foo="postgres 3625 1 0 Jan31 ? 00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data"
標準bash
機能を使用して実行できます。
$ echo ${foo:0:5}
postg
$ echo ${foo: -10:10}
pgsql/data
$ echo ${foo:0:5} ${foo: -10:10}
postg pgsql/data
$ echo ${foo:0:5}${foo: -10:10}
postgpgsql/data
2番目のドアの負のオフセットは、「終わりから始まる」を意味します。
答え2
使用sed
:
sed -E 's/(.{5}).*(.{10})$/\1\2/' infile
またはcut
andを使用してくださいwc
(入力として1行しかない場合、またはすべての行の長さが同じ場合)。
cut -c1-5,$(($(wc -c <infile)-10))- <infile
答え3
コマンドラインメソッドのコレクションを豊かにするには、次の手順を実行します。
s="postgres 3625 1 0 Jan31 ? 00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data"
grep
方法:
echo $(printf "%s" $(grep -Eo '^.{5}|.{10}$' <<<"$s"))
postgpgsql/data
awk
方法:
awk '{ print substr($0,1,5) substr($0, length-9) }' <<<"$s"
postgpgsql/data
答え4
colrmとwcの別の方法
start=5
end=10
s='postgres 3625 1 0 Jan31 ? 00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data'
# with dash
printf "%s\n" "$s" | colrm $start $(($(printf "%s\n" "$s" | wc -c)-$end))
# with bash
# <<<$s colrm $start $(($(wc -c <<<$s)-$end))