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

