我有以下几行:
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
不太确定你想在这里做什么,但是
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
使用sed
:
sed -E 's/(.{5}).*(.{10})$/\1\2/' infile
或者使用cut
and wc
(如果只有一行作为输入或所有行的长度相同):
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))