使用bash从文本文件中删除符号

时间:2016-10-27 14:31:24

标签: regex bash vim

我有一堆包含这样的东西的txt文件:

text_i_need_to_remove{text_i_need_to_retain}
text_i need_to_remove{text_i_need_to_retain}
...

如何在大括号(和大括号本身)之前删除文本并仅保留text_i_need_to_retain

4 个答案:

答案 0 :(得分:4)

删除行尾<{1}}或{的所有内容

}


:%s/.*{\|}$//g shell,您可以使用bashsed等文字处理工具。假设文件名为awk

1)使用ip.txt,这与我们在sed内使用的正则表达式非常相似。 vim标志允许进行更改,即修改输入文件本身。

-i


2)使用$ sed -i 's/.*{\|}$//g' ip.txt ,可以再次使用替换,或者在这种情况下,在大括号上拆分行并仅使用第二列。

awk

如果您有$ awk -F'{|}' '{print $2}' ip.txt > tmp && mv tmp ip.txt ,则可以选择GNU awk进行现场编辑

-i inplace


要更改当前目录中的所有文件,请使用

$ gawk -i inplace -F'{|}' '{print $2}' ip.txt 

如果他们有共同的扩展名,请说sed -i 's/.*{\|}$//g' * ,请使用

.txt

答案 1 :(得分:3)

:%s/^.*{\(.*\)}$/\1/或bash,sed 's/^.*{\(.*\)}$/\1/ foo.txt

\(.*\)是一个控制组,可以输入\1,看起来像一个笨重的僵尸。

答案 2 :(得分:2)

你可以在vim中使用它;

:%s/^.*{// | %s/}$//

你也可以使用这个脚本;首先运行这个,如果everythink没问题,请使用-i选项取消注释sed,如下所示;

#!/bin/bash

for item in $(ls /dir/where/my/files/are)
do
sed -i 's/^.*{//;s/}$//' /dir/where/my/files/are/$item
done

sed -i; inplace replace

仅使用如下;

  sed -i 's/^.*{//;s/}$//' /dir/where/my/files/are/*

答案 3 :(得分:1)

Perl可用于对所有文件进行替换:

perl -i -pe 's/.*{|}$//g' *.txt