sed如何从每一行中删除最后一个字符

时间:2020-01-09 10:43:35  来源:igfitidea点击:

如何从" ${__ allowed_ips}"等行和shell变量中删除最后一个字符。
例如,文件中的每一行如下:

foo,
bar,
demo,

如何输出如下:

foo
bar
demo

如何使用sed删除最后一个字符?

sed是一个免费的开源流编辑器,适用于Linux,macOS,* BSD和类似Unix的系统。
它是删除/删除最后一个字符以及对文件或者shell变量执行其他选项的理想选择。

sed从每一行中删除最后一个字符

使用sed,涉及文本操作时,一切都很容易。
使用sed查找和替换文本的语法如下:

sed 's/search/replace/' input > output
sed -i'.BAK' 's/search/replace/' input
sed 's/search/replace/' <<<"${var}"

例如,从输入行中删除最后一位数字(例如6),如下所示:

echo "this is a test6" | sed 's/.$//'

"."(点)表示sed中的任何字符,而" $"表示行尾。
换句话说,".$"表示仅删除最后一个字符。
接下来,我们将使用cat命令如下创建文件:

cat > demo.txt

如下添加文本:

this is a test,
I love Unix,
I like Linux too,

要从demo.txt中删除每行的最后一个字符,请使用sed命令:

sed 's/.$//' demo.txt > output.txt
`## Linux GNU/sed version syntax ##`
sed -i 's/.$//' demo.txt

验证一下:

cat demo.txt
cat output.txt

在Linux桌面上使用sed从每一行中删除最后一个字符

关于有条件删除最后一个字符的注释

默认情况下,到目前为止使用的sed命令将删除所有最后一个字符。
但是,说您只能将删除限制为数字,如下所示:

echo "I love Pizza6" | sed 's/[0-9]$//'
echo "The best blog in Unixverse3" | sed 's/[[:digit:]]$//'
echo "I love Pizza6Times" | sed 's/[0-9]$//'

[0-9]/[[:digit:]]表示所有数字,例如0、1、2、3、4、5、6、7、8和9。
类似地,我们可以使用以下删除所有字母:

echo "I love donuts two times a dayz" | sed 's/[[:alpha:]]$//'
echo "I love donuts 2 times a dayZ" | sed 's/[[:upper:]]$//'

sed括号表达式

字符类描述
[[:alnum:]]字母数字字符:[[:alpha:]][[:digit:]]; 在C语言环境和ASCII字符编码中,这与[0-9A-Za-z]相同。
[[:alpha:]]字母字符:[[:lower:]][[:upper:]];在C语言环境和ASCII字符编码中,这与[A-Za-z]相同。
[[:blank:]]空白字符:空格和制表符。
[[:cntrl:]]控制字符。在ASCII中,这些字符的八进制代码为000至037,以及177(DEL)。在其他字符集中,这些是等效的字符(如果有)。
[[:digit:]]数字:0 1 2 3 4 5 6 7 8 9.
[[:::]]图形字符:[[:alnum:]][[:punct:]]
[[:: lower:]]小写字母;在C语言环境和ASCII字符编码中,这是b c d e f g h i j k l m n o p q r s t u v w x y z。
[[:print:]]可打印字符::alnum::punct:和空格。
[[:: punct:]]标点符号;在C语言环境和ASCII字符编码中,这是! #$%&()* +,。 /:; <- ? @ [\] ^ _`{
[[:: space:]]空格字符:在C语言环境中,这是制表符,换行符,垂直制表符,换页符,回车符和空格。
[[:upper:]]大写字母:在C语言环境和ASCII字符编码中,这是A B C D E F G H I J K L M N O P Q R S T U V W X YZ。
[[:xdigit:]]

sed从shell变量中删除最后一个字符

让我们定义一个名为IP的shell变量,如下所示:

IP="192.168.1.25,"
printf "%s\n" $IP

假设您要删除名为的最后一个字符,请运行:

## sed remove last character from $IP ##
sed 's/,$//' <<<"${IP}"
## 或者 
echo $IP | sed 's/.$//' 
## Append more IPs separated by ',' ##
IP="192.168.1.200,$IP"
IP="192.168.5.253,$IP"
## Update IP variable by deleting last ',' ##
IP=$(sed 's/,$//' <<<"${IP}")
echo "${IP}"

如何使用sed刮掉最后一个字符

这是我们启动新的AWS EC2/Google GCP/Linode(StackScripts)云实例时运行的另一个小Shell脚本代码段:

#!/bin/bash
## define our VPN auth IPs for sysadmins and backup agents ##
_admin_ips="192.5.1.1|MUM_VPN 1.2.3.4|DEL_VPN 1.1.1.4|NYC_VPN 203.1.2.3|CGP_BACKUP_AGENT 3.1.2.3|AWS_BACKUP_AGENT"
 
_ip=""
 
## Turn on firewall on each Debian/Ubuntu box ##
yes | ufw enable 
 
## Allow ssh login to $_admin_ips only ##
for e in $_admin_ips
do 
ufw allow from "${e%%|*}" to any port 22 proto tcp comment "Open TCP SSH PORT for ${e##*|}"
_ip="${e%%|*},${_root_ip}"  ## Build IP list ## 
done
 
## sed delete last character from the list to avoid sshd errors  ##
_ip="$(sed 's/.$//'<<<${_root_ip})"
 
## Okay, update our sshd config ##
## Disable root login (if enabled by default) for all and only allow ssh key based login ##
sed -i'.BAK' -e 's/PermitRootLogin yes/PermitRootLogin no/g' -e 's/#PasswordAuthentication yes/PasswordAuthentication no/g'  /etc/ssh/sshd_config
 
## Allow root users and backup agents to login as root from selected IPs with ssh keys only ##
echo "Match Address ${_root_ip}" >>/etc/ssh/sshd_config 
echo -e "\tPermitRootLogin yes" >>/etc/ssh/sshd_config
 
## Run other init tasks ##
_service_url="https://1.254.254.254/${project_id}/${service_provider}"
task_add_user "admin" "${_service_url}/encrypted_passwd.txt" "${_service_url}/id_ed25519.pub"
task_apply_security_settings "${_service_url}/security.sh"
task_apply_patches "${os}" "${_service_url}/${os}/patches.sh"
 
## Rest of config will be done by sysadmin or Ansbile or our Docker scripts##
## Reboot the box ##
reboot