man*_*uel 25 shell-script text-processing
在以下文件中:
Lorem ipsum dolor 坐 amet,consectetuer adipiscing 精英。Ut eu metus id lectus 前庭 ultrices。Maecenas rhoncus。
我想删除之前consectetuer
和之后的所有内容elit
。
我想要的输出:
consectetuer adipiscing elit.
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
Mik*_*keV 39
我会用 sed
sed 's/^.*\(consectetuer.*elit\).*$/\1/' file
Run Code Online (Sandbox Code Playgroud)
解码 sed s/find/replace/ 语法:
s/^.*
-- 替换从行首 ( ^
)开始,然后是任何 ( .*
) 直到...\(
- 启动一个命名块consectetuer.*elit\.
- 匹配第一个单词,所有 ( .*
) 直到最后一个单词(在这种情况下,包括尾随(转义)点)要匹配\)
- 结束命名块.*
)匹配到行尾 ( $
)/
- 结束替代查找部分\1
- 替换为\(
和\)
上面之间的名称块/
- 结束替换如果每一行都包含开始和结束模式,那么最简单的方法是使用grep
. 您可以简单地输出两个模式之间的内容,而不是删除每行的开头和结尾。-o
GNU 中的选项grep
仅输出匹配项:
grep -o 'consectetuer.*elit' file
Run Code Online (Sandbox Code Playgroud)
注意:如前所述,这仅适用于文件中的每一行都可以通过这种方式解析的情况。再说一次,这是所有典型用例的 80%。
我不确定为什么这个问题标题已被“从文件”编辑为“从一行”,而OP并不排除跨多行的可能性,即使该示例似乎只有一行。不管怎样,在这里提供多行解决方案可能会有所帮助。
这适用于交叉线(from1
如果且to2
存在于文件中,则此答案有效。 ):
from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
Run Code Online (Sandbox Code Playgroud)
例子:
[xiaobai@xiaobai tmp]$ cat file
1
abc consectetuer lsl
home
def elit dd
2 consectetuer ABC elit
[xiaobai@xiaobai tmp]$ from1=consectetuer; to2=elit; a="$(cat file)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}$to2"
consectetuer lsl
home
def elit
[xiaobai@xiaobai tmp]$
Run Code Online (Sandbox Code Playgroud)
参考:Shell参数扩展
归档时间: |
|
查看次数: |
96677 次 |
最近记录: |