我想从文件中交换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 没有出现在该行中。那么最好的方法是什么?。
答案 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 所述,这可以通过
进一步简化$i
变量。1
。结果:
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