shell - 如何删除文件开头的两个匹配字符串(仅第一次出现)之间的文本?
问题描述
我正在尝试删除文件开头之间/*
的文本。*/
可以有white spaces
或new lines (\n)
之前或之间/*
和*/
。
我尝试了以下操作,但在有空格或换行时不起作用。
sed '/^\/\*/,/\*\//d' file
示例文件:
/*******
delete
bla
***
*/
/* do not */
print "hi"
/*******
dont delete
****/
预期输出:
/* do not */
print "hi"
/*******
dont delete
****/
解决方案
在每个 UNIX 机器上的任何 shell 中使用任何 awk,这将从您提供的输入中产生您想要的输出:
$ awk 'f; /\*\//{f=1}' file
/* do not */
print "hi"
/*******
dont delete
****/
但也要考虑这种更一般的方法:
$ cat tst.awk
{ rec = (NR>1 ? rec ORS : "") $0 }
END {
$0 = rec
gsub(/@/,"@A"); gsub(/{/,"@B"); gsub(/}/,"@C")
gsub(/\/\*/,"{"); gsub(/\*\//,"}")
sub(/^[[:space:]]*{[^}]*}[[:blank:]]*\n/,"")
gsub(/}/,"*/"); gsub(/{/,"/*")
gsub(/@C/,"}"); gsub(/@B/,"{"); gsub(/@A/,"@")
print
}
.
$ awk -f tst.awk file
/* do not */
print "hi"
/*******
dont delete
****/
有关这些 gsub() 正在做什么的说明,请参阅https://stackoverflow.com/a/56658441/1745001 。
推荐阅读
- ionic-framework - 如何在不需要诉诸按钮事件的情况下动态执行减法?
- android - 从 Firebase 获取通知历史记录
- java - Java ProcessBuilder 返回退出错误 128 在 linux 中执行 git(一些 git 命令工作正常)
- firebase - 无法添加新的 Firebase 项目
- acumatica - AR 逾期逾期查询
- ruby-on-rails - 如何在 Rails 中设置我的配置文件以让 SendGrid 在 Heroku 中工作?AuthenticationError(535 失败:用户名/密码错误
- matlab - Jenkins powershell 块不会等到它完成
- oracle - 如何在 Oracle jdbc 瘦连接 url 中给出 TLS1.2 参数
- javascript - 如何循环检查 p 元素是否为空的条件?
- html - 在可点击的弹性容器中制作完整区域 - 弹性逐项锚标签以填充无序列表中的可用空间?