2016-10-27 86 views
0

我有一個包含這樣的東西一堆TXT的文件:使用bash從文本文件中刪除符號

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保留?

+0

這是一個非常基本的正則表達式的應用;數以千計的互聯網教程將教你如何。在Vim中:學習如何查看命令並導航內置的':help';它是全面的,並提供許多技巧。你不會像其他編輯一樣學習Vim,但如果你承諾不斷學習,它將證明它是一個非常強大和高效的編輯器。 –

回答

4

在行

:%s/.*{\|}$//g 


月底從bash殼刪除所有字符都{},您可以使用文字處理工具,如sedawk。假設文件名爲ip.txt

1)與sed,這與我們在vim中使用的正則表達式非常相似。 -i標誌允許進行更改,即修改輸入文件本身。

$ sed -i 's/.*{\|}$//g' ip.txt 


2)同awk,可以再次使用取代或在這種情況下,拆對大括號的線和僅使用第二列中。

$ awk -F'{|}' '{print $2}' ip.txt > tmp && mv tmp ip.txt 

如果你有GNU awk,對於就地編輯

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


作出改變當前目錄下的所有文件-i inplace選項,使用

sed -i 's/.*{\|}$//g' * 

或者,如果他們有共同的延伸,說.txt,使用

sed -i 's/.*{\|}$//g' *.txt 
+0

非常感謝!它現在是有道理的:) – fremorie

2

你可以在vim中使用它;

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

你也可以使用這個腳本;首先運行這個,如果每個方面都可以,請使用-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;置換取代

僅限如下使用;

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

謝謝! 那麼,它會在bash中看起來如何? for $(ls/dir/where/my/files/are)中的項目; do vim $ item:%s /^.*{// | s /。\ {1} $ //; done 這樣的事情? – fremorie

+0

@DariaSmirnova:我更新了答案。你可以試試這個嗎? –

+0

Yesss,很棒,就是我需要的。謝謝! :) – fremorie

3

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

\(.*\)是送入\1和看起來像一個笨拙殭屍對照組。

1

Perl可以用來做的所有文件替代:

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