我试图弄清楚如何将所有偶数行移动到所有奇数行的开头,如下所示:
前:
AAA
BBB
CCC
DDD
后:
BBBAAA
DDDCCC
我可以一次在多个文件上运行的东西会很棒,因为使用 cat 组合所有文件会产生一个太大而无法处理的文件。类似于以下用于进行文本交换的命令,以便我可以将其添加到 bash 文件中:
find /directory/. -type f -exec sed -i 's/oldtext/newtext/g' {} \;
我已经搜索过,但没有找到合适的东西。
为了使事情变得更容易,我可以将“string1”添加到所有奇数行的开头,将“string2”添加到所有偶数行的开头,如下所示:
before:
string1AAA
string2BBB
string1CCC
string2DDD
after:
string2BBBstring1AAA
string2DDDstring1CCC
十分感谢。
答案1
忘记带有前缀的想法。您正在寻找的脚本是
sed 'N;s/\(.*\)\n\(.*\)/\2\1/'
也就是说,用 读取下一行N
,然后更改顺序并删除换行符。
您可以将其与find
您所写的结合起来。首先尝试不带选项-i
来测试这是否是您想要的。
答案2
呆呆地解决方案:
for f in /directory/*; do gawk -i inplace '{getline nl; print nl$0}' "$f"; done
for f in /directory/*
- 对于指定路径中的每个文件
gawk -i inplace
- 使能够到位文件编辑
getline nl
- 从 awk 的输入中读取下一条记录到变量中nl
(下一行)
print nl$0
- 打印当前和下一条交换的记录
答案3
使用 GNU sed
:
sed '1~2 { h; d; }; G; s/\n//'
和awk
:
awk '{ if(NR%2) save = $0; else print $0 save }'
和perl
:
perl -pe '$_ = <> . $_; s/\n//'
答案4
eval "`echo 'NL=qsq' | tr 'qs' '\047\012'`"; # newline
set --
while IFS= read -r l; do
case $# in
0 ) set -- "$l" ;;
* ) printf '%s%s\n' "$l" "$1"; set -- ;;
esac
done < input.data
printf '%s' ${1+"$1$NL"} # to take care of dangling line
awk '{ if ( NR % 2 ) ORS = $0 RS; else print }' input.data
perl -lpe '$_ = (<>.$_) =~ s/\n//r' input.data
sed -ne '
${p;d;}
h;n;G;s/\n//p
' input.data
结果
BBBAAA
DDDCCC