替换换行符的选项卡,并与SED一起删除换行符

时间:2017-08-13 04:31:45

标签: bash sed

我在这些词之间有标签(五):

int id; double amount; String name; public Banks(int id, double amount, String name){ setId(id); setAmount(amount); setName(name); } public void setId(int id) { if(id <= 0) { System.out.println("ID must be greater than 0"); } this.id = id; } public void setAmount(double amount) { if(amount < 0){ System.out.println("Amount must be greater than or equal to 0"); } this.amount = amount; } public void setName(String name) { this.name = name; } public int getId(){ return id; } public double getAmount(){ return amount; } public String getName(){ return name; } @Override public String toString(){ return id + " " + amount + " " + name; } }

我想要这个输出:

cat
dog

我试过这个: public class TestMyClass { public static void main(String [] args){ System.out.println("Test 1"); testSetId(); System.out.println("Test 2"); testSetAmount(); System.out.println("Test 3"); testSetName(); } public static void testConstructor() { Banks testObject1 = new Banks(1, 500, "Mario"); System.out.println(testObject1); } public static void testSetId() { Banks testObject2 = new Banks(1, 500, "Mario"); testObject2.setId(0); } public static void testSetAmount() { Banks testObject3 = new Banks(1, 500, "Toad"); testObject3.setAmount(-25); } public static void testSetName() { Banks testObject4 = new Banks(1, 500, "Luigi"); System.out.printf("Old object3 name: %s%n", testObject4.getName()); testObject4.setName("Mr Luigi"); System.out.printf("New object3 name: %s%n", testObject4.getName()); } 输出与cat dog

相同
cat




dog

我必须执行两次sed以获得我想要的东西。与sed 's/\t/\n/g; /^$/d' pets

之后的sed 's/\t/\n/g' pets一样

有没有办法通过一个命令获得所需的输出?

2 个答案:

答案 0 :(得分:2)

继续发表评论。 sed 's/\t/\n/g的问题是,您将{{1>}替换每个 '\t'。您希望使用单个换行替换选项卡的序列。为此你需要:

'\n'

或者如果您希望sed 's/\t\t*/\n/g' 明确地将'\t'括在[ ]中,也可以。

表达式'\t'与单个标签匹配,后面跟'\t\t*'匹配标签,后面有零个或多个标签替换序列使用单个'\n',产生您想要的输出:

cat
dog

最后的g(全局)只会用一个换行符替换每个序列,例如:

"cat     dog           fish" 

(由制表符分隔),变为

cat
dog
fish

如果您有任何问题,请与我们联系。

答案 1 :(得分:1)

如果选项卡的数量很重要,BRE将允许您通过转义大括号来指定边界,如下所示:

$ sed $'s/\t\{5\}/\\\n/' <<<$'one\t\t\t\t\ttwo'
one
two

请注意,您尚未指定操作系统,因此不知道您是否使用GNU sed,这样可以在正则表达式中包含\t之类的内容。 (我使用FreeBSD和macOS,其中sed没有此功能。)但是你已经提到你正在使用bash,它支持"format expansion"。您可以使用此bash功能在脚本中插入“文字”特殊字符。