输入:
$ 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