在bash中交换文件中2个单词的最佳方法是什么

时间:2016-12-14 06:23:27

标签: regex linux bash shell unix

我想从文件中交换2个单词。

例如:在下面的文件中,我想用一个

替换一个和两个
This is a test file one and two
test line again two
last line two one

我知道我可以通过以下方式实现这一目标:

 sed 's/one/\n/g;s/two/one/g;s/\n/two/g' test.txt

但在上述方法中我假设 \ n 没有出现在该行中。那么最好的方法是什么?。

4 个答案:

答案 0 :(得分:3)

从不 [0]是模式空间中的换行符,因为sed逐行读取。

值得注意的是,POSIX sed并未严格支持更换部件中的\n。在模式中,支持部分\n

参考:s/pattern/replacement/

[0]你可以通过使用像Next和Get这样的附加命令在模式空间中实现多行。但你必须明确,所以有人可能会认为换行是交换价值的最佳选择。

答案 1 :(得分:2)

使用preg_split时,您不需要regEx类型的替换,只需使用经典的临时字符串交换进行替换。 (sed),适用于每一行上的模式的任何实例,假设输入文件是这样的。要确保文件中没有出现临时随机tmp=a;a=b;b=tmp;,请创建一个随机字符串并将其分配给tmp变量

tmp

并删除任何可能损害正常$ tmp="$(openssl rand -base64 32)" $ tmp="${tmp//[^[:alnum:]]/}" 操作的非字母数字字符。

sed

$ cat file This is a test file two and one two one two two two test line again one two one two last line one two two two 逻辑负责所有替换

sed

答案 2 :(得分:2)

您可以使用awk循环遍历行中的条目:

awk '{
        for (i=1;i<=NF;i++){
          printf "%s ", ($i=="one" ? "two" : $i=="two" ? "one" : $i); 
        };
        printf "\n";
      }'  file

事实上,正如用户 andlrc 所述,这可以通过

进一步简化
  1. 重新分配到$i变量。
  2. 使用默认操作,即打印当前行,其可以由任何真值触发,例如, 1
  3. 结果:

    awk '{for(i=1;i<=NF;i++){ $i=($i=="one"?"two": $i=="two"?"one": $i);}; 1}'  file
    

答案 3 :(得分:1)

sed在逐行的基础上工作。您可以通过首先在缓冲区中获取多行(考虑进行流编辑)来使sed考虑多行。

搜索sed替换&#39; \ n&#39;,或查看this

您可能需要查找模式空间,高级sed和标签。

我的常规搜索指南是on this link