微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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没有出现在行中。 那么最好的办法是什么?

基本的正则expression式为16位数字

sed打印第n个正则expression式的行

Windows批处理:如何删除所有空白(或空)行

如何删除前缀,后缀匹配模式的string和使用sed分割字符?

如何使用sed删除双空行?

正则expression式的问题,以消除JavaScript恶意软件

在string中查找date和时间,并使用Windows或cmd中的sed重新格式化删除空格

Nginx获取url的子域名并且指定文档根目录

在bash脚本中添加数字表示“找不到”

使用DOS / Batch分割具有随机长度的string

在模式空间中不会有换行符,因为sed是逐行读取的。

不过值得注意的是,在替换部分n不严格支持POSIX sed。 在模式部分n是支持的。

参考: s/pattern/replacement/

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

在使用sed ,您不需要使用regEx类型替换,只需使用经典的临时字符串替换即可。 ( 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逻辑负责所有的替换

sed "s/two/$tmp/g;s/one/two/g;s/$tmp/one/g" file This is a test file one and two one two one one one test line again two one two one last line two one one one

你可以用awk来遍历行中的条目:

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

实际上,正如用户和lrc所指出的那样 ,这可以通过进一步简化

重新分配给$i变量。

使用认操作,即打印当前行,可以由任何真值触发,例如1 。

结果:

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

sed在逐行的基础上工作。 你可以让sed考虑多行,首先在被考虑进行流编辑的缓冲区中获得多行。

搜索sed替换' n',或者看看这个

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

我的一般前往sed指南是在这链接

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐