如何删除两个字符串之间的字符串?

如何删除两个字符串之间的字符串?

输入:

$ cat a.txt
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\\ h\:mm\\ AM\/PM\;\@";' x:str>BAR

输出:

$ sed 's/SOMEMAGIC//g' a.txt
FOOBAR

我的问题:我怎样才能删除那个可怕的“<tdalign......”部分?这让我发疯!

答案1

嗯,这当然很简单:

sed -i 's/<.*>//' file

这里就不做过多解释了:

  • <是我们想要匹配的部分的开始
  • .*表示任意字符 ( .) 和任意数量 ( *)。这是一门杀死蚊子的大炮,但应该适用于非深奥的例子
  • >比赛结束。

这是直播:

➜  ~  cat test 
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\\ h\:mm\\ AM\/PM\;\@";' x:str>BAR
➜  ~  sed 's/<.*>//' test
FOOBAR

答案2

你也可以用这个,

sed 's/^\([^<]*\)<.*>\(.*\)$/\1\2/g' file

解释:

^\([^<]*\)<-<从起始位置开始提取任何非零次或多次的字符<,最后将提取的字符存储到一个组中。

.*> - 匹配任何字符零次或多次,直到找到>

\(.*\)$- 一旦 sed 找到字符,它就开始将直到最后一个字符>的所有字符存储到另一个组中(>>在和之间存储字符$)。

最后通过反向引用sed仅打印存储的组( \1, ) 。\2

例子:

$ cat file.txt
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\\ h\:mm\\ AM\/PM\;\@";' x:str>BAR
$ sed 's/^\([^<]*\)<.*>\(.*\)$/\1\2/g' file.txt
FOOBAR

答案3

一个perl办法:

$ perl -F'<.*>' -anle 'print @F' file
FOOBAR

这里我们使用正则表达式<.*>作为分隔符来分割行而不是删除它。

答案4

 sed -i 's/\(A\) B \(C\)/\1\2' /path/to/example.file

这将使字符串 A 和 C 保持不变,并剪切字符串 B。将字母替换为您选择的字符串/正则表达式。

例子

$ echo A B C | sed 's/\(A\) B \(C\)/\1\2'
$ AC

相关内容