2016-10-16 20 views
0

我將Testng斷言轉換爲AssertJ我使用的是sed命令。我絞死當有新的行狀陳述,在Unix下處理sed的新行

了Exa 1:

assertEquals(person.getAddressLine1(), 
     "This is long line, so needs to go in second line as per Formatter.........!!!!!!!"); 

了Exa 2:

assertEquals(person.getAddressLine1(), 
      "This is very long line, so needs to break down in multiple" + 
        "This is very long line, so needs to break down in multiple" + 
        "This is very long line, so needs to break down in multiple"); 

我目前的解決方案:這是運行完美用於單線斷言。

sed -i 's/assertEquals([[:blank:]]*\(.\+\),[[:blank:]]*\(["].\+["]\+\))[[:blank:]]*;/Assertions.assertThat(\1).isEqualTo(\2);/g' 

注意:我知道,我可以改變我的編輯Formatterr線的最大長度,但不知何故,因爲那時我需要做的,我不能改變它按Ctrl ++F再次,這對我來說是不可能的。

UPDATED:這兩個例子的預期輸出如下。

了Exa 1:

Assertions.assertThat(person.getAddressLine1()).isEqualTo("This is long line, so needs to go in second line as per Formatter.........!!!!!!!"); 

了Exa 2:

Assertions.assertThat(person.getAddressLine1()).isEqualTo("This is very long line, so needs to break down in multiple" + 
     "This is very long line, so needs to break down in multiple" + 
     "This is very long line, so needs to break down in multiple"); 
+1

你是否願意接受一個解決方案,多主張將'被轉換成sed'單行語句? – Leon

+2

當斷言中使用了逗號和雙引號時,任何基於正則表達式的解決方案都會出錯。 'assertEquals(「a」引用的\「value,foo,bar」,str);' – anubhava

+0

@Leon:是的...... –

回答

0

sed可以潛在地做到這一點,但命令會更復雜,因爲新行的存在。下面是一個使用Slurp的方式做同樣的一個簡單的perl命令:

perl -00 -pe 's/\bassertEquals\(\s*([^,]+),\s*([^)]+)\)\s*;/Assertions.assertThat($1).isEqualTo($2);/' file 

RegEx Demo


使用sed,你可以這樣做:爲您的支持

sed -i -E ':a;N;s/\n[ \t]*//g;s/;/;\n/;s/assertEquals\([[:blank:]]*([^,]+),[[:blank:]]*([^)]+)\)[[:blank:]]*;/Assertions.assertThat(\1).isEqualTo(\2);/;ba' file 
+0

謝謝@anubhava,但實際上我需要它與sed。 –

+0

謝謝@anubhava,但你可能錯過了我已經回答了我自己之前你嘗試過'sed' –

+1

啊剛纔意識到。你最後有'{}'\;'(可能來自'find'命令的'-exec'選項) – anubhava

0

謝謝你們,按照我的要求,我終於可以用sed來完成了。

sed -i ':a;N;$!ba;s/[[:blank:]]*assertEquals(\([^;]\+\),\(\n[[:blank:]]*\([^;]\+\(\n\)*\)\))[[:blank:]]*;/ Assertions.assertThat(\1).isEqualTo(\2);/g' '{}' \; 
0

這是一個簡單的近似您希望在第一個參數assertEquals完全是在第一行和不包含逗號,將工作內容:

sed -i 's/assertEquals(\s*\([^,]\+\),/Assertions.assertThat(\1).isEqualTo(/g' 
0

如果你訪問到awk,這也可能會做

腳本

awk '$0 ~ /assertEquals\(person.getAddressLine1\(\),/{ 
printf "Assertions.assertThat(person.getAddressLine1()).isEqualTo("; 
getline; 
gsub(/^[[:blank:]]*"/,"\"")}1' filename 

樣本輸出

Assertions.assertThat(person.getAddressLine1()).isEqualTo("This is very long line, so needs to break down in multiple" + 
     "This is very long line, so needs to break down in multiple" + 
     "This is very long line, so needs to break down in multiple");