由于这个问题被标记为sed,我的第一个答案是: 首先(使用任意_标记已查看的空格,当a.txt包含do to what时:
sed -e '
:a;
s/\([^_]*\) \([^ ]*\)/\2_\1/;
ta;
y/_/ /;
' a.txt
what to do
字符串 那么,当a.txt包含do to to what时:
sed -e '
:a;
s/^\(\|.* \)\([^+ ]\+\) \2\([+]*\)\(\| .*\)$/\1\2\3+\4/g;
ta;
:b;
s/\([^_]*\) \([^ ]*\)/\2_\1/;
tb;
y/_/ /;
' <<<'do to to to what'
what to++ do
型 每个 * suppressed * 重复的单词有一个+:
sed -e ':a;s/^\(\|.* \)\([^+ ]\+\) \2\([+]*\)\(\| .*\)$/\1\2\3+\4/g;ta;
:b;s/\([^_]*\) \([^ ]*\)/\2_\1/;tb;
y/_/ /;' <<<'do do to what what what what'
what+++ to do+
revcnt() {
local out i;
for ((i=$#; i>0; i--))
do
[[ $out =~ ${!i}[+]*$ ]] && out+=+ || out+=\ ${!i};
done;
echo $out
}
型 其中提交的字符串必须作为参数提交:
revcnt do do to what what what what
what+++ to do+
型 或者如果需要处理 * 标准输入 *(或从文件):
revcnt() {
local out i arr;
while read -a arr; do
out=""
for ((i=${#arr[@]}; i--; 1))
do
[[ $out =~ ${arr[i]}[+]*$ ]] && out+=+ || out+=\ ${arr[i]};
done;
echo $out;
done
}
型 因此,您可以处理多行:
revcnt <<eof
do to what
do to to to what
do do to what what what what
eof
what to do
what to++ do
what+++ to do+
$ cat a.txt
do to what
$ sed -ri '/do.*what/ s/do/what/' a.txt
$ cat a.txt
what to what
$ sed -ri '/what.*what/ s/what$/do/' a.txt
$ cat a.txt
what to do
7条答案
按热度按时间mzsu5hc01#
我知道
tac
可以做一些相关的事情字符串
其中
-s
定义分隔符,默认情况下是换行符。5us2dqdw2#
我会使用
awk
来实现这一点:字符串
结果如下:
型
如果您需要一行程序来“就地”修改文件,请尝试:
型
bgtovc5b3#
sed答案
由于这个问题被标记为sed,我的第一个答案是:
首先(使用任意
_
标记已查看的空格,当a.txt
包含do to what
时:字符串
那么,当
a.txt
包含do to to what
时:型
每个 * suppressed * 重复的单词有一个
+
:型
bash答案
但是,由于有很多人在寻找简单的bash解决方案,因此有一个简单的方法:
型
这可以写成:
型
或者使用一些bash脚本:
型
将执行:
型
或 pure bash
型
其中提交的字符串必须作为参数提交:
型
或者如果需要处理 * 标准输入 *(或从文件):
型
因此,您可以处理多行:
型
gab6jxml4#
这可能对你有用(GNU sed):
字符串
说明:
G
在模式空间的末尾添加换行符(PS):a
循环名称空间s/^\n//;t
当换行符位于PS前面时,将其移除并打印行s/^(\S+|\s+)(.*)\n/\2\n\1/;ta
直接在换行符后面插入一个非空格或空格字符串并循环到:a
-r
开关使regexp更容易看到(分组(...)
、交替...|...
和一个或多个+
的元字符无需使用反斜杠前缀)。备选方案:
型
注意:要反转生产线,应采用上述解决方案:
型
eeq64g8w5#
也许你会喜欢Perl:
字符串
liwlm1x96#
作为Bernhard said,
tac
可以在这里使用:字符串
我认为我的例子更有帮助。
i2loujxw7#
SED:
当你知道你想要交换的确切单词时:
字符串
但是你必须确切地知道单词的位置、它们的环境、围绕着它们的词、它们是在句子/行的开头还是结尾等等。要使用的正确元字符将取决于该信息。