2010-12-11 46 views
0

我是新來的bash腳本,但我要做到以下幾點:使用bash腳本的正則表達式

我要檢測的模式「STRING_2」 STRING_1在FILE_1並追加STRING_2至FILE_2

什麼是簡單的方法來做到這一點?

回答

1

你的問題相當模糊;但我猜測你想

什麼,如果STRING_1在FILE_1存在,追加STRING_2至FILE_2

answer=`grep -c STRING_1 FILE_1` 
if [ "$answer" -gt 0 ] 
then 
    echo "$STRING_2" >> FILE_2 
fi 
+0

或'grep -c STRING_1 FILE_1 && echo「$ STRING_2」>> FILE_2' :)但我不確定這是他的意思,雖然問題非常模糊.. – redShadow 2010-12-11 00:59:40

+0

如果STRING_2未知,則無法使用。 redShadow的建議的替代方案,但仍然使用'if'將是:'如果grep -sq STRING_1 FILE_1; then'。沒有變量,括號或比較需要。 – 2010-12-11 01:12:30

1

你可以這樣做:

sed 's/STRING_1 \"(.*)\"/\1/g' FILE_1 >FILE_2 

這裏發生了什麼,是sed是灼熱的FILE_1中的第一個和第二個'/'之間的所有內容以及第二個和第三個'/'之間的內容發送給FILE_2。

()組分配給\ 1 \ 2,等等......所以一切都在\之間「S是你STRING_2。

+2

你需要使用'>>'來追加。沒有必要轉義雙引號,但它是轉義括號(除非你使用'-r'選項來指定'sed'。將模式從'。*'改爲'[^「 ] *'因爲'sed'正則表達式是貪婪的。 – 2010-12-11 01:07:55

0

如果我理解正確的問題,所以你有一個包含文件:

word1a "word1b" 
word2a "word2b" 
word3a "word3b" 

您可以用sed提取包含引號之間的值,然後重定向到一個文件

sed 's/.*"\(.*\)"/\1/' FILE_1 > FILE_2 
0

您也可以使用此:

grep '^\s*STRING_1\s*\".*\"\s*$' FILE_1 | awk -F \" '{printf $2"\n"}' >> FILE_2 

它能夠正確處理輸入文件的多個空白字符,並在FILE_2末尾的STRING_2後面追加換行符。

1
grep -Po '(?<=aaa ")([^"]*)(?=")' FILE_1 >> FILE_2 
+0

不錯..我沒有考慮使用否定斷言和'-o',但它似乎工作,並且是避免使用'grep | sed'管道.. – redShadow 2010-12-11 19:24:32

0

這是我現在:

SED的/ STRING_1 \ S *:\ S * 「([^」] *)「/ \ 1/G' 」FILE_1「> > FILE_2;

我希望它檢測以下模式文件1:

STRING_1 : "STRING_2" 

並保存STRING_2到文件2

但這不起作用,它附加了很多的隨機東西到FILE_2(這不應該匹配)