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