首先我要说的是,我知道可能有一种更简单的方法可以做到这一点。 但这就是我所拥有的,希望我能在最后做出一些改进和/或简化。
目前的目标
将下面$tmp
变量中存储的输出加倍,并分别对每一行进行编号。这样做应该在不同的行上给我每组可执行命令。
问题1
我已经尝试了所有我能想到的内容,以便将变量中的内容加倍。移动双空间命令,并更改命令本身。
为我试图修改此代码的文件编号:
sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /
当然,用awk进行了实验但没有进展..
不是那么长期目标
file1 file2
的diff命令,然后将输出保存在某个变量中,例如:"$diffA $diffB"
并在每次使用循环时更新它,以便传递超过2个文件的机会作为参数。file1中的第1行与file2中的第1行不同,请查看:“$ diffA $ diffB”
这是我到目前为止的一个开始:
#!/bin/bash
FILE="$1"
echo "You Entered $FILE"
if [ -f $FILE ]; then
tmp=$(cat $FILE | sed '/./!d' | sed -n '/regex/,/regex/{/regex/d;p}'| sed -n '/---/,+2!p' | sed -n '/#/!p' | sed 's/^[ ]*//' | sed -e\
s/[^:]*:// | sed -n '/regex /!p' | sed -n '/regex /!p' | sed -n '/"regex"/,+1!p' | sed -n '/======/!p' | sed -n '/regex/!p' | sed -n '/regex\
\r/!p' | sed -n '/regex /!p' )
fi
MyVar=$(echo $tmp)
echo "$MyVar | sed G"
FILE2="$2"
if [ -f $FILE2 ]; then
if [ -f $FILE2 ]; then
tmp2=$(cat $FILE2 | sed -n '/regex/,/regex/{/regex\ S/d;p}' |\
sed -n '/#/!p' | sed -e s/[^:]*:// | sed /--------/,+10d)
fi
echo "$tmp2"
非常感谢任何帮助。
答案 0 :(得分:1)
以下awk脚本会将输出空间加倍并对行进行编号:
awk ' { print NF " " $0; print ""; }'
您的问题是将其分配给变量:
( echo a; echo b) | awk ' { print NR " " $0; print ""; }'
给出:
1 a
2 b
但
tmp=$(( echo a; echo b) | awk ' { print NR " " $0; print ""; }')
echo "$tmp"
给出
1 a 2 b
因为使用$()会用空格替换换行符。您将不得不使用临时文件:
tmp=$(mktemp)
awk ' { print NR " " $0; print ""; }' $FILE > $tmp
cat $tmp # Do something with the file
rm $tmp # Don't forget to clean up after yourself.
答案 1 :(得分:0)
使用临时文件的另一种方法是使用引号来抑制换行/空格替换:
tmp="$(echo a; echo b)"
echo "$tmp"
答案 2 :(得分:0)
这可能对您有用:
a=$(printf "aaa %d\n" {1..5} | sed = | sed 'N;s/\n//;G')
echo $a
1aaa 1 2aaa 2 3aaa 3 4aaa 4 5aaa 5
echo "$a"
1aaa 1
2aaa 2
3aaa 3
4aaa 4
5aaa 5
说明:
sed =
插入行号,附加换行符,然后附加一行sed 'N's/\n//;G'
附加换行符,读取另一行并追加。 s/\n//
删除嵌入的换行符。 G
在行尾添加换行符。在周期结束时,在打印之前重新连接换行符。